繁体   English   中英

遍历向量的 unordered_map

[英]Iterating over unordered_map of vectors

我知道这是一些基本的东西,但我无法遍历std::vectorsunordered_map并打印每个向量的内容。 我的unordered_map如下所示:

std::unordered_map<std::string, std::vector<int> > _dict;

现在我可以打印 map 的first属性:

for (auto &it : _dict)
{
    std::cout << it.first <<std::endl;
}

但是在尝试打印second属性时它给了我一个错误。 有谁知道我怎么能做到这一点? 谢谢!

您必须对向量使用内部循环。

字符串只是一个元素,它可以按原样打印,向量是元素的集合,所以你需要一个循环来打印它的内容:

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;
    }
}

如果要打印向量中的特定项目,则需要访问要打印的项目的 position:

for (auto &it : _dict)
{
    std::cout << it.second.at(0) << std::endl; //print the first element of the vector
}

C++17:基于范围的 for 循环中的结构化绑定声明

从 C++17 开始,您可以使用结构化绑定声明作为基于范围的 for 循环中的范围声明,以及std::copystd::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;
}

您可以使用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;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM