我是否可以仅通过添加数字来增加迭代器?

问题描述 投票:42回答:3

我可以使用迭代器进行常规计算,即仅通过添加数字来对其进行递增?

例如,如果要删除元素vec[3],我可以这样做吗:

std::vector<int> vec;
for(int i = 0; i < 5; ++i){
      vec.push_back(i);
}
vec.erase(vec.begin() + 3); // removes vec[3] element

它对我有用(g ++),但是我不确定是否[[保证可以工作。

c++ iterator
3个回答
47
投票
如果迭代器是一个随机访问迭代器,则它起作用,矢量的迭代器是该迭代器(请参见reference)。 STL函数std::advance可用于推进通用迭代器,但由于它不返回迭代器,因此我倾向于使用+(如果可用),因为它看起来更干净。

C ++ 11注意

现在有std::advancestd::next,它们[返回迭代器,因此,如果您在模板领域中工作,则可以使用它们来推进通用迭代器,并且仍然具有干净的代码。

2
投票

2
投票
std::advance

导致实现定义的行为。使用operator+Distance,您可以要求编译器通过警告标志std::size_t n = (1 << 64) - 2; std::vector<double> vec(1 << 64); std::vector<double> slice(vec.begin() + n, vec.end()); 来警告您这种不当的转换,警告标志g++不属于规范的clang-Wsign-conversion

一种解决方法是直接在指针上工作

-Wall

这不漂亮,但正确。在某些情况下,您需要手动构造迭代器,例如

-Wextra
© www.soinside.com 2019 - 2024. All rights reserved.