Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 递减std::vector::begin是否未定义,即使从未使用过它?_C++_Iterator - Fatal编程技术网

C++ 递减std::vector::begin是否未定义,即使从未使用过它?

C++ 递减std::vector::begin是否未定义,即使从未使用过它?,c++,iterator,C++,Iterator,请注意,与关于这个主题的许多问题以及为什么我在google和stackoverflow上都找不到满意的答案相反,我从来没有取消引用*begin-1 我的要求是: 向后迭代 使用不使用反向迭代器的函数,在本例中为vector::erase 尽量保持代码的整洁,因此尽量避免以下的心理杂耍: vector.eraserev_it.base-1 反向迭代器现在应该是什么来获取迭代中的下一个元素?erase?+返回的迭代器1,可能吧1,不太可能 我想到的是: for (auto it = vector.e

请注意,与关于这个主题的许多问题以及为什么我在google和stackoverflow上都找不到满意的答案相反,我从来没有取消引用*begin-1

我的要求是:

向后迭代 使用不使用反向迭代器的函数,在本例中为vector::erase 尽量保持代码的整洁,因此尽量避免以下的心理杂耍:

vector.eraserev_it.base-1

反向迭代器现在应该是什么来获取迭代中的下一个元素?erase?+返回的迭代器1,可能吧1,不太可能

我想到的是:

for (auto it = vector.end(); it-- != vector.begin(); ) {
    if (condition(*it)) {
        it = vector.erase(it);
    }
}
这似乎是可行的,因为它返回迭代器的值,然后只将其递减,这意味着迭代器总是在检查之后但在进入循环体之前递减

特别是:

当进入循环时 如果vector.end==vector.begin,则向量为空,我们立即退出循环 如果vector.end!=然后我们进入循环,第一个循环体使用它执行==vector.end-1 删除元素时

Vector .EraseIT返回vector中的以下元素,因此在每次迭代中递减迭代器使我们能够准确地考虑向量中的每个元素。

退出循环时 在循环体的最后一次执行时,it==vector.begin,因此下次尝试循环条件时:

条件返回false 它是最后一次递减 我们退出循环 也就是说,我的代码似乎确实计算了迭代器位置begin-1,但从未访问它,也没有将它用于比较或类似的事情

这是未定义的行为吗? 我是不是冒着犯错的风险?或者只是访问未初始化的数据?什么都没有,因为迭代器在使用之前就被丢弃了?没有办法知道吗?

怎么样

for (auto it = vector.end(); it != vector.begin(); ) {
    --it;
    ... rest of the loop body
怎么样

for (auto it = vector.end(); it != vector.begin(); ) {
    --it;
    ... rest of the loop body

它因遗漏而未定义。在任何情况下,为什么不使用反向迭代器呢?这意味着迭代器总是在检查之后但在进入循环体之前递减-这根本不是真的。迭代器被复制到一个temp,然后递减,然后temp副本通过值返回。这是迭代器类上实现后减量运算符的唯一正确方法。迭代器在检查前处于UB land中;首先,参与检查的不是迭代器;副本是这样的。@WhozCraig它只是看起来那样,实际上并不是这样的,你是绝对正确的。我来编辑一下。这并没有改变我的问题的底线:这个递减的未定义迭代器重要吗?最终你的问题是,在序列开始(即开始)的双向迭代器上应用递减操作合法吗。据我所知,唯一支持它的容器迭代器是std::forward\u list,它支持before\u begin迭代器的构造。顺便说一句,你不是第一个问这个问题的人。建议和这里一样:反向迭代器。@WhozCraig实际上我可能把球门柱移到这里一点,我会还原它。你的第一个评论就是我在看的或者说是真的。即使我似乎不依赖UB当前的行为,也可以用一两句话来解释为什么UB是坏的?它没有被遗漏定义。在任何情况下,为什么不使用反向迭代器呢?这意味着迭代器总是在检查之后但在进入循环体之前递减-这根本不是真的。迭代器被复制到一个temp,然后递减,然后temp副本通过值返回。这是迭代器类上实现后减量运算符的唯一正确方法。迭代器在检查前处于UB land中;首先,参与检查的不是迭代器;副本是这样的。@WhozCraig它只是看起来那样,实际上并不是这样的,你是绝对正确的。我来编辑一下。这并没有改变我的问题的底线:这个递减的未定义迭代器重要吗?最终你的问题是,在序列开始(即开始)的双向迭代器上应用递减操作合法吗。据我所知,唯一支持它的容器迭代器是std::forward\u list,它支持before\u begin迭代器的构造。顺便说一句,你不是第一个问这个问题的人。建议和这里一样:反向迭代器。@WhozCraig实际上我可能把球门柱移到这里一点,我会还原它。你的第一个评论就是我在看的或者说是真的。即使我似乎不依赖UB当前的行为,你是否愿意在帖子中用一两句话来解释为什么UB是坏的?