如何遍历const容器中的容器?

时间:2018-03-19 03:35:18

标签: c++ loops const

假设您具有包含以下参数的不完整函数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,但功能仍然失败。我错过了什么吗?

1 个答案:

答案 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)将使地图搜索密钥,这在复杂性方面并不重要。