关于字典:如何打印出C ++地图值?

How can I print out C++ map values?

我有一个这样的map

1
map<string, pair<string,string> > myMap;

我在地图中插入了一些数据,使用:

1
myMap.insert(make_pair(first_name, make_pair(middle_name, last_name)));

现在如何打印出地图中的所有数据?


1
2
3
4
5
6
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 <<"
"
;
}

在C++ 11中,你不需要拼出EDOCX1,0。您可以使用auto

1
2
3
4
5
for(auto it = myMap.cbegin(); it != myMap.cend(); ++it)
{
    std::cout << it->first <<"" << it->second.first <<"" << it->second.second <<"
"
;
}

注意使用cbegin()cend()功能。

更简单的是,您可以使用基于范围的for循环:

1
2
3
4
5
for(auto elem : myMap)
{
   std::cout << elem.first <<"" << elem.second.first <<"" << elem.second.second <<"
"
;
}

如果你的编译器支持(至少部分)C++ 11,你可以做一些类似的事情:

1
2
3
4
5
for (auto& t : myMap)
    std::cout << t.first <<""
              << t.second.first <<""
              << t.second.second <<"
"
;

对于C++ 03,我使用EDCOX1,4,用插入操作符代替:

1
2
3
4
5
6
7
8
9
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,"
"
));


由于C++ 17,可以使用基于范围的循环和结构化绑定来在地图上迭代。这提高了可读性,因为您减少了代码中所需的firstsecond成员的数量:

1
2
3
4
5
6
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)

科利鲁代码