我可以使用迭代器进行正常计算,即只需通过添加数字来增加它吗?
例如,如果我想删除元素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
Run Code Online (Sandbox Code Playgroud)
它适用于我(g ++),但我不确定它是否可以保证工作.
Tod*_*ner 46
如果迭代器是一个随机访问迭代器,它的向量迭代器是(参见参考资料).STL函数std::advance
可用于推进通用迭代器,但由于它不返回迭代器,我倾向于使用+如果可用,因为它看起来更干净.
C++ 11注意
现在有std::next
和std::prev
,它做返回的迭代器,所以如果你是在模板土地工作,你可以用它们来推动通用的迭代,仍然有干净的代码.
一个微妙的点是,operator+
需要 a Distance
; 即有符号整数。如果您将迭代器增加一个无符号数,您可能会失去精度并遇到意外。例如在 64 位系统上,
std::size_t n = (1 << 64) - 2;
std::vector<double> vec(1 << 64);
std::vector<double> slice(vec.begin() + n, vec.end());
Run Code Online (Sandbox Code Playgroud)
导致实现定义的行为。使用g++
or clang
,您可以要求编译器使用-Wsign-conversion
不属于规范-Wall
or一部分的警告标志来警告您此类不需要的转换-Wextra
。
解决方法是直接处理指针
std::vector<double> slice(vec.data() + n, vec.data() + vec.size());
Run Code Online (Sandbox Code Playgroud)
它不漂亮但是正确。在某些情况下,您需要手动构造迭代器,例如
std::vector<double>::iterator fromHere{vec.data() + n};
vec.erase(fromHere, vec.end());
Run Code Online (Sandbox Code Playgroud)