我想遍历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<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;
}
正如来自莫斯科的@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 );