假设您具有包含以下参数的不完整函数iterate,const
映射具有pair<int, vector<string>>
以及以下循环:
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映射要求迭代器为const map<int, vector<string>>::const_iterator
。那讲得通。但是,当试图遍历const
映射中的向量时,auto
必须是什么类型,或者是不可能遍历const容器中的容器。我尝试制作auto
vector<string>::const_iterator
,但功能仍然失败。我错过了什么吗?
答案 0 :(得分:3)
真的,帮自己一个忙,并使用基于循环的范围:
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循环),那么继续阅读。
您没有正确使用迭代器。您正在使用指向地图中元素的迭代器,然后获取它以获取元素的关键。这不是如何使用迭代器。
相反,您应该使用迭代器直接指向的对象。
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
。 A有了地图,你应该可以动态创建:
// creates element at key `123`
m[123] = {"many", "strings", "in", "vector"};
对于容器在新键处创建的元素,它必须将新元素保存在自身中,因此它必须改变自身以提供operator[]
,因此它不是常量。
您也可以使用std::map::at()
,但在您的情况下它并不值得。使用operator[]
或map.at(key)
将使地图搜索密钥,这在复杂性方面并不重要。