C ++遍历地图


215

我想遍历中的每个元素而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?  
       }
}

Answers:


486

您可以像下面这样实现:

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

7
在“它”前面添加“自动”类型
iedoc

2
@ P0W为什么对于C ++ 11为“ auto const&”,而对于C ++ 17为“ const auto&”?“ auto const&”和“ const auto&”之间有什么区别?
艾瑞克(Eric)

35
没有区别,只是品味问题。但是,似乎@ P0W的味道不太一致...
Kapichu

15
感谢您使用C ++ 17更新,我正在寻找auto const& [key, val] : symbolTable格式!

3
@haram您可能必须在项目设置(配置属性> C / C ++>语言> C ++语言标准)中设置“ ISO C ++ 17标准(/ std:c ++ 17)”
Swordfish,

27

尝试以下

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

考虑到value_type为std::map以下方式定义

typedef pair<const Key, T> value_type

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

如果将函数声明为

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

14

所述value_typemap是一种pair含有该键和值,因为它的firstsecond分别构件。

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

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

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

6

正如来自莫斯科的@Vlad所说,请注意value_typestd::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在这种情况下将转换为什么。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.