![](/img/trans.png)
[英]Decrementing std::vector::iterator before std::vector::begin()
[英]Is decrementing std::vector::begin undefined, even if it is never used?
请注意,与关于该主题的许多问题相反(以及为什么我在 google 和 stackoverflow 上都找不到这个问题的满意答案),我从不取消引用*(begin() - 1)
我的要求是:
vector::erase()
尽量保持代码干净,所以尽量避免心理上的杂耍:
vector.erase(rev_it.base() - 1)
(反向迭代器现在应该是什么来获取迭代中的下一个元素? erase()
返回的迭代器? + 1
,可能是? - 1
,不太可能?)
我想出的是:
for (auto it = vector.end(); it-- != vector.begin(); ) {
if (condition(*it)) {
it = vector.erase(it);
}
}
这似乎有效,因为it--
返回迭代器的值,然后只递减它,这意味着迭代器总是在检查之后但在进入循环体之前递减。
特别是:
vector.end() == vector.begin()
向量为空,我们立即退出循环vector.end() != vector.begin()
然后我们进入循环,第一个循环体执行it == vector.end() - 1
vector.erase(it)
返回向量中的以下元素,因此在每次迭代时递减迭代器让我们只考虑向量中的每个元素一次。
在最后一次执行循环体时, it == vector.begin()
,所以下次我们尝试循环条件时:
false
it
递减最后一次也就是说,我的代码似乎确实计算了迭代器位置begin() - 1
但从不访问它,也不使用它进行比较或类似的操作。
我是否冒着段错误的风险? 或者只是访问未初始化的数据? 什么都没有,因为迭代器在使用之前就被丢弃了? 没有办法知道吗?
怎么样
for (auto it = vector.end(); it != vector.begin(); ) {
--it;
... rest of the loop body
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.