假设您有一个不完整的函数 iterate,它有以下参数,一个 const
有 pair<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/