使用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();
例如,如果我希望成员为两个,或者最后三个,或者其他什么。
答案 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>::iterator
是RandomAccessIterator,这意味着它“可以移动到指向任何一个恒定时间中的元素“ 1 通过加/减。另一方面,std::map<T,U>::iterator
是BidirectionalIterator,它可以向任一方向移动,但只能以1为增量。
1 http://en.cppreference.com/w/cpp/concept/RandomAccessIterator
答案 2 :(得分:0)
模板类std::vector
具有随机访问迭代器,其操作h.end() - 2
已定义。
另一方面,模板类std::map
具有双向迭代器,其操作h.end() - 2
未定义。
如果包含标头<iterator>
,则可以使用标准函数std::next
和std::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 );