我想遍历map<string, int>中的每个元素,而不知道它的任何string-int值或键。

到目前为止我有:

void output(map<string, int> table)
{
       map<string, int>::iterator it;
       for (it = table.begin(); it != table.end(); it++)
       {
            //How do I access each element?  
       }
}

当前回答

map的value_type是一对,分别包含键和值作为它的第一个和第二个成员。

map<string, int>::iterator it;
for (it = symbolTable.begin(); it != symbolTable.end(); it++)
{
    std::cout << it->first << ' ' << it->second << '\n';
}

或者在c++ 11中,使用基于范围的for:

for (auto const& p : symbolTable)
{
    std::cout << p.first << ' ' << p.second << '\n';
}

其他回答

你可以这样做:

map<string, int>::iterator it;

for (it = symbolTable.begin(); it != symbolTable.end(); it++)
{
    std::cout << it->first    // string (key)
              << ':'
              << it->second   // string's value 
              << std::endl;
}

在c++ 11(及以后)中,

for (auto const& x : symbolTable)
{
    std::cout << x.first  // string (key)
              << ':' 
              << x.second // string's value 
              << std::endl;
}

在c++ 17(及以后)中,

for (auto const& [key, val] : symbolTable)
{
    std::cout << key        // string (key)
              << ':'  
              << val        // string's value
              << std::endl;
}

map的value_type是一对,分别包含键和值作为它的第一个和第二个成员。

map<string, int>::iterator it;
for (it = symbolTable.begin(); it != symbolTable.end(); it++)
{
    std::cout << it->first << ' ' << it->second << '\n';
}

或者在c++ 11中,使用基于范围的for:

for (auto const& p : symbolTable)
{
    std::cout << p.first << ' ' << p.second << '\n';
}

它甚至可以用经典的for循环来实现。 手动推进迭代器。

typedef std::map<int, int> Map;

Map mymap;

mymap['a']=50;
mymap['b']=100;
mymap['c']=150;
mymap['d']=200;

bool itexist = false;
int sizeMap = static_cast<int>(mymap.size());
auto it = mymap.begin();
for(int i = 0; i < sizeMap; i++){
    std::cout << "Key: " << it->first << " Value: " << it->second << std::endl;
    it++;
}

正如来自莫斯科的@Vlad所说, 考虑std::map的value_type是这样定义的:

typedef pair<const Key, T> value_type

这意味着如果你想用一个更显式的类型说明符替换关键字auto,那么你可以这样;

for ( const pair<const string, int> &p : table ) {
   std::cout << p.first << '\t' << p.second << std::endl;
} 

只是为了理解这里auto会转化成什么。

试试下面的方法

for ( const auto &p : table )
{
   std::cout << p.first << '\t' << p.second << std::endl;
} 

同样可以使用普通的for循环来编写

for ( auto it = table.begin(); it != table.end(); ++it  )
{
   std::cout << it->first << '\t' << it->second << std::endl;
} 

请注意std::map的value_type是按以下方式定义的

typedef pair<const Key, T> value_type

因此,在我的例子中,p是对value_type的const引用,其中Key是std::string, T是int

此外,如果将函数声明为将会更好

void output( const map<string, int> &table );