我想遍历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?
}
}
由于P0W为每个c++版本提供了完整的语法,我想通过查看您的代码来添加更多的点
始终采用const & as参数,以避免同一对象的额外副本。
使用unordered_map,因为它总是更快使用。请看这个讨论
下面是一个示例代码:
#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;
}
试试下面的方法
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 );
你可以这样做:
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会转化成什么。