如何打印出C++ map的值?

88

我有一个像这样的map

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

我已经使用以下代码向我的地图中插入了一些数据:

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

我现在该如何打印出我的映射表中的所有数据?


2
请查看此问题 - Mankarse
你可以使用迭代器遍历地图,获取键和成对的值,并将 cout::operator<< 应用于它们。这并不难,真的。 - user529758
这个问题和答案应该可以解决它。 - Benjamin Trent
1
可能是如何循环遍历C++ Map的重复问题。 - Hogan
5个回答

128
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(const auto& elem : myMap)
{
   std::cout << elem.first << " " << elem.second.first << " " << elem.second.second << "\n";
}

最后一个不是更慢吗? - Paul
2
@Paul:我将其编辑为const auto&以避免元素的复制。希望这就是你想要的。除此之外,最后一个并不更慢。 - Armen Tsirunyan

34

自从C++17以来,您可以使用range-based for循环structured bindings一起迭代您的映射。这提高了可读性,因为您减少了代码中所需的firstsecond成员数量:

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)

在Coliru上的代码


2
好的更新!你可能想在for循环中将参数作为const引用。 - andreee
当我尝试使用for循环时,出现“标识符'k'未定义”的错误。 - AlphaFoxtrot
@AlphaFoxtrot:你真的编译成了C++17吗?正如你从Coliru的链接中所看到的,代码实际上是可以工作的。 - honk
啊,我明白了。我最近下载了Visual Studio,以为它会让我使用最新的版本。结果发现我在使用C++98。 - AlphaFoxtrot

31
如果您的编译器支持(至少部分)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"));

为什么在上面的代码片段中需要使用 & 符号? - Manjunath
5
使用一个引用符 & 可以避免在循环迭代期间进行复制。 - CyprUS

1
最简单的方法是首先声明一个迭代器,如下所示:
map<string ,string> :: iterator it;

然后通过使用从 myMap.begin()myMap.end() 的迭代器循环遍历 map,并使用 it->first 来打印出 map 中的键和 it->second 来打印出值。
  map<string ,string> :: iterator it;
    for(it=myMap.begin();it !=myMap.end();++it)
      {
       std::cout << it->first << ' ' <<it->second;
      }

1
你可以尝试像这样使用基于范围的循环

for(auto& x:myMap){
        cout<<x.first<<" "<<x.second.first<<" "<<x.second.second<<endl;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接