c++ - 如何遍历 const 容器中的容器?

标签 c++ loops constants

假设您有一个不完整的函数 iterate,它有以下参数,一个 constpair<int, vector<string>> 的 map 以及以下循环:

string iterate(const map<int, vector<string>>& m) {
    for (map<int, vector<string>>::const_iterator start_iter = m.begin(); start_iter != m.end(); ++start_iter) {   
        for (auto vector_iter = m[(*start_iter).first].begin(); vector_iter != m[(*start_iter).first].end(); ++vector_iter) {
        }
    }
}

遍历 const map 需要迭代器是 const,map<int, vector<string>>::const_iterator .这就说得通了。但是,当尝试遍历 const 中的 vector 时映射什么类型auto必须是,或者不可能遍历 const 容器中的容器。我试着制作 auto vector<string>::const_iterator ,但该功能仍然失败。我错过了什么吗?

最佳答案

真的,帮自己一个忙,使用基于范围的 for 循环:

for (auto&& [key, vec] : m) {
    for (auto&& vec_element : vec) {
        // All vec elements
    }
}

如果您不想使用 C++17(您应该使用,C++17 很棒!),那么请这样做:

for (auto&& m_element : m) {
    for (auto&& vec_element : m_element.second) {
        // All vec elements
    }
}

如果您真的想使用迭代器(您真的应该使用基于范围的 for 循环),请继续阅读。

您没有正确使用迭代器。您正在使用指向 map 中元素的迭代器,然后获取它的键以取回该元素。这不是如何使用迭代器。

相反,您应该直接使用迭代器指向的对象。

for (auto start_iter = m.begin(); start_iter != m.end(); ++start_iter) {   
    for (auto vector_iter = start_iter->second.begin(); vector_iter != start_iter->second.end(); ++vector_iter) {
        // shuff with vector_iter
    }
}

现在为什么 operator[] 失败了?

那是因为它是一个std::map。有了 map ,您应该能够即时创建一些东西:

// creates element at key `123`
m[123] = {"many", "strings", "in", "vector"};

对于要由容器在新键上创建的元素,它必须将新元素保存在自身中,因此它必须改变自身以提供 operator[],因此它不是 const。

您也可以使用 std::map::at(),但在您的情况下不值得这样做。使用 operator[]map.at(key) 将使 map 搜索键,这在复杂性上并非微不足道。

关于c++ - 如何遍历 const 容器中的容器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49355440/

相关文章:

r - 如何在 R 中为 Monte Carlo 创建更有效的模拟循环

c - do-while 循环不遵守真值分配 (C)

android - 循环时听按钮

c - 使用带有常量变量的 if 语句时收到错误 - C

c++ - 通过构造函数传递和存储 const 引用?

python 'constants' 并更改它们

c++ - 如何将 C++ 枚举与 UnitTest++ 检查一起使用?

c++ - GDB:如何在调试期间检查当前行号

c++ - 模糊定时器(边界内随机)(Arduino)

c++ - 无法区分 JSON Object/Array/String