C ++循环映射

时间:2014-10-09 15:12:09

标签: c++ dictionary

我想遍历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?  
       }
}

6 个答案:

答案 0 :(得分:301)

您可以实现以下目标:

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 ;
}

答案 1 :(得分:24)

尝试以下

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 );

答案 2 :(得分:12)

value_type的{​​{1}}是map,其中包含密钥和值,分别为pairfirst成员。

second

或者使用C ++ 11,使用基于范围的:

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

答案 3 :(得分:4)

来自莫斯科的@Vlad说, 考虑到value_type std::map的定义方式如下:

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在这种情况下会转化为什么。

答案 4 :(得分:1)

由于P0W已为每个C ++版本提供了完整的语法,因此我想通过查看您的代码来添加更多点

  • 始终使用const &作为参数,以避免重复复制同一对象。
  • 使用unordered_map,因为它总是更快地使用。参见this discussion

下面是示例代码:

#include <iostream>
#include <unordered_map>
using namespace std;

void output(const auto& table)
{
   for (auto const & [k, v] : table)
   {
        std::cout << "Key: " << k << " Value: " << v << std::endl;
   }
}

int main() {
    std::unordered_map<string, int> mydata = {
        {"one", 1},
        {"two", 2},
        {"three", 3}
    };
    output(mydata);
    return 0;
}

答案 5 :(得分:0)

它甚至可以通过经典的 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++;
}