如何将std :: map的迭代器递减一定数量?

Zeb*_*ish 2 c++ dictionary iterator std c++11

使用std :: vector我可以:

std::vector<int> h;
auto it = h.end() - 2;
Run Code Online (Sandbox Code Playgroud)

但是使用std :: map我不能这样做:

std::map<int, int> h;
auto it = h.end() - 2;
Run Code Online (Sandbox Code Playgroud)

我只能这样做:

auto it = --h.end();
Run Code Online (Sandbox Code Playgroud)

例如,如果我希望成员为两个,或者最后三个,或者其他什么.

Hol*_*olt 8

你可以使用std::advance:

auto it = h.end();
std::advance(it, -4);
Run Code Online (Sandbox Code Playgroud)

需要注意的是复杂性是线性n(第二个参数)的std::map迭代器(不是随机访问迭代器),这意味着没有"魔法",并调用std::advance相当于应用n倍递增/递减操作上的迭代器.

  • "我们不会退缩;我们正朝着不同的方向前进" - 朝鲜战争中的奥利弗·史密斯将军 (10认同)
  • 你也可以使用`std :: prev`,如果你想要引用较少引用:) (2认同)

Arn*_*rah 7

另一方面,您也可以使用std::prev,如下:

auto it = std::prev(iter, 2);
Run Code Online (Sandbox Code Playgroud)

在内部,这与std::advance(事实上​​使用它)完全相同,除了可以说这更清楚一点.

如果你想知道为什么你不能减去地图迭代器而不像矢量迭代器,原因是因为它std::vector<T>::iterator是一个RandomAccessIterator,这意味着它"可以通过加法/减法移动到指向恒定时间内的任何元素" 1.另一方面,std::map<T,U>::iteratorBidirectionalIterator,它可以向任一方向移动,但只能以1为增量.

1 http://en.cppreference.com/w/cpp/concept/RandomAccessIterator