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

时间:2018-01-18 13:16:04

标签: c++ c++11 dictionary iterator std

使用std :: vector我可以这样做:

std::vector<int> h;
auto it = h.end() - 2;

但是使用std :: map我无法做到:

std::map<int, int> h;
auto it = h.end() - 2;

我只能这样做:

auto it = --h.end();

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

3 个答案:

答案 0 :(得分:8)

您可以使用std::advance

auto it = h.end();
std::advance(it, -4);

请注意,n(第二个参数)std::map迭代器(不是随机访问迭代器)的复杂度为线性,这意味着没有&# 34;魔&#34;调用std::advance相当于在迭代器上应用n次递增/递减运算符。

答案 1 :(得分:7)

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

auto it = std::prev(iter, 2);

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

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

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

答案 2 :(得分:0)

模板类std::vector具有随机访问迭代器,其操作h.end() - 2已定义。

另一方面,模板类std::map具有双向迭代器,其操作h.end() - 2未定义。

如果包含标头<iterator>,则可以使用标准函数std::nextstd::prev作为随机访问迭代器和双向迭代器。

例如

$include <map>
#include <iterator>

//...

std::map<int, int> h;
//...
auto it = std::prev( h.end(), 2 );

#include <vector>
#include <iterator>

//...

std::vector<int> h;
//...
auto it = std::prev( h.end(), 2 );