为什么我不能在C++的`map`迭代器中使用`+1`?

3

我在使用map时遇到了迭代器问题。我有一个类型为map<int, vector<int> > vpmap;map。我想要遍历整个map,然后我使用了以下代码:

 for (size_t i = 0; i < vpmap.size(); i++) {
    {
        auto it = vpmap.begin();
        it++;
        /*code*/
    }

这很好。但是当我将 it++ 替换为 it=it+1 时,编译器会报错。在使用 vector 时,我以前没有遇到过这种错误。我想知道原因。


2
要迭代地图,您应该使用类似于 for(auto const& [key, val]: vpmap) 的东西。 - The Philomath
无论迭代器类型如何,您都可以使用 it = std::advance(it, 1) 替代 it = it + 1。而且,您可以使用任何数字或变量来替代 1,甚至是负数值。 - 273K
2个回答

7

std::vector::iterator 是一个LegacyRandomAccessIterator。它需要支持操作 it + 1

另一方面,std::map::iterator 是一个LegacyBidirectionalIterator。它不需要支持 it + 1,但是需要支持 it++it--

这个帖子的答案中有相关细节:

原因在于将 N 添加到随机访问迭代器是常数时间(例如,将 N*sizeof(T) 添加到 T*),而对于双向迭代器来说,做同样的事情需要应用 ++ N 次。


5

itstd::map 的迭代器,它是一个 双向迭代器,不支持 operator+

随机访问迭代器 支持 operator+,例如 std::vector 的迭代器,这就是为什么你在使用 std::vector 时没有遇到此错误的原因。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接