我有map
这样:
map<string, pair<string,string> > myMap;
我使用以下方法将一些数据插入到地图中
myMap.insert(make_pair(first_name, make_pair(middle_name, last_name)));
我现在如何打印出地图中的所有数据?
答案 0 :(得分:69)
for(map<string, pair<string,string> >::const_iterator it = myMap.begin();
it != myMap.end(); ++it)
{
std::cout << it->first << " " << it->second.first << " " << it->second.second << "\n";
}
在C ++ 11中,您不需要拼出map<string, pair<string,string> >::const_iterator
。您可以使用auto
for(auto it = myMap.cbegin(); it != myMap.cend(); ++it)
{
std::cout << it->first << " " << it->second.first << " " << it->second.second << "\n";
}
请注意使用cbegin()
和cend()
函数。
更简单,您可以使用基于范围的for循环:
for(auto elem : myMap)
{
std::cout << elem.first << " " << elem.second.first << " " << elem.second.second << "\n";
}
答案 1 :(得分:22)
如果您的编译器支持(至少部分)C ++ 11,您可以执行以下操作:
for (auto& t : myMap)
std::cout << t.first << " "
<< t.second.first << " "
<< t.second.second << "\n";
对于C ++ 03,我使用std::copy
代替插入运算符:
typedef std::pair<string, std::pair<string, string> > T;
std::ostream &operator<<(std::ostream &os, T const &t) {
return os << t.first << " " << t.second.first << " " << t.second.second;
}
// ...
std:copy(myMap.begin(), myMap.end(), std::ostream_iterator<T>(std::cout, "\n"));
答案 2 :(得分:3)
自C++17起,您可以将range-based for loops与structured bindings一起用于遍历地图。由于减少了代码中所需的first
和second
成员的数量,因此提高了可读性:
std::map<std::string, std::pair<std::string, std::string>> myMap;
myMap["x"] = { "a", "b" };
myMap["y"] = { "c", "d" };
for (const auto &[k, v] : myMap)
std::cout << "m[" << k << "] = (" << v.first << ", " << v.second << ") " << std::endl;
输出:
m [x] =(a,b)
m [y] =(c,d)