遍历向量的 unordered_map
Posted
技术标签:
【中文标题】遍历向量的 unordered_map【英文标题】:Iterating over unordered_map of vectors 【发布时间】:2020-06-27 19:05:47 【问题描述】:我知道这是一些基本的东西,但我无法遍历 unordered_map
或 std::vectors
并打印每个向量的内容。我的unordered_map
看起来像这样:
std::unordered_map<std::string, std::vector<int> > _dict;
现在我可以打印地图的first
属性:
for (auto &it : _dict)
std::cout << it.first <<std::endl;
但在尝试打印 second
属性时出现错误。有谁知道我怎么能做到这一点?谢谢!
【问题讨论】:
没有标准的方式来流式传输矢量,所以你需要写一些具体的东西 这能回答你的问题吗? How to print out the contents of a vector? 【参考方案1】:C++17:基于范围的 for 循环中的结构化绑定声明
从 C++17 开始,您可以使用structured binding declaration 作为range-based for loop 中的范围声明,同时使用std::copy
和std::ostream_iterator
来编写连续的std::vector
元素到std::cout
:
#include <algorithm>
#include <iostream>
#include <iterator>
#include <string>
#include <unordered_map>
#include <vector>
int main()
const std::unordered_map<std::string, std::vector<int> > dict =
"foo", 1, 2, 3,
"bar", 1, 2, 3
;
for (const auto& [key, v] : dict)
std::cout << key << ": ";
std::copy(v.begin(), v.end(), std::ostream_iterator<int>(std::cout, " "));
std::cout << "\n";
// bar: 1 2 3
// foo: 1 2 3
return 0;
【讨论】:
【参考方案2】:您必须对向量使用内部循环。
字符串只是一个元素,可以按原样打印,向量是元素的集合,所以你需要一个循环来打印它的内容:
std::unordered_map<std::string, std::vector<int>> _dict;
for (auto &it : _dict)
for (auto &i : it.second) // it.second is the vector
std::cout << i;
如果您想打印向量中的特定项目,您需要访问要打印的项目的位置:
for (auto &it : _dict)
std::cout << it.second.at(0) << std::endl; //print the first element of the vector
【讨论】:
【参考方案3】:您可以使用range-for loop
打印std::vector <int>
的内容:
for(auto it : _dict)
std::cout << it.first << ": ";
for(int item : it.second)
std::cout << item << " ";
std::cout << std::endl;
【讨论】:
以上是关于遍历向量的 unordered_map的主要内容,如果未能解决你的问题,请参考以下文章