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)
例如,如果我希望成员为两个,或者最后三个,或者其他什么.
你可以使用std::advance:
auto it = h.end();
std::advance(it, -4);
Run Code Online (Sandbox Code Playgroud)
需要注意的是复杂性是线性的n(第二个参数)的std::map迭代器(不是随机访问迭代器),这意味着没有"魔法",并调用std::advance相当于应用n倍递增/递减操作上的迭代器.
另一方面,您也可以使用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>::iterator是BidirectionalIterator,它可以向任一方向移动,但只能以1为增量.
1 http://en.cppreference.com/w/cpp/concept/RandomAccessIterator
| 归档时间: |
|
| 查看次数: |
709 次 |
| 最近记录: |