递减 std::vector::begin 是否未定义,即使它从未被使用过?
Is decrementing std::vector::begin undefined, even if it is never used?
请注意,与关于该主题的许多问题相反(可能以及为什么我在谷歌和堆栈溢出上都找不到这个问题的满意答案(,我从不取消引用*(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
相关文章:
- 尝试使用 std::vector<std::thread时出现静态断言失败错误>
- 字符串化递归的"std::vector<std::vector<...>>"而不使用部分模板函数专用化
- 连接和压缩标准::vector<std::字符串的最佳方法>
- C++从 std::vector<std::function<中删除 std::function>>
- 如何在构造函数初始值设定项列表中使用 n 个元素初始化 std::vector<std::time_t>
- 如何使用 CUDA 将 std::vector<std::string> 复制到 GPU 设备
- 编译错误 std::vector<std::shared_ptr<T>>迭代器和擦除方法
- 将 std::vector<std::unique_ptr<T>> 移动到 std::vector<std::shared_ptr<T>>
- 如何从 boost::container::vector<std::string>::iterator 访问索引和对象?
- 使用 std::vector<std::future<int>> 和 std::async 启动几个线程时中止
- 为什么转置这个 std::vector<std::vector<std::string> > 这么慢?
- 是否有可能在没有复制的情况下传递 std::vector<int> 作为参数来获得 std::vector<std::array<int, 3>>?
- 在 boost::<double>asio::buffer 中使用像 std::vector<std::complex> 这样的参数
- 如何从 std::initializer_list<char const* 构建 std::vector<std::string>>
- 如何检查 std::vector<std::string> 的元素是否以某个子字符串开头?
- 在 std::vector<std::vector 中重新存储内部向量<TYPE>>
- 将 std::vector<std::string> 转换为 const char* const*
- 不能将结构push_back() 转换为 std::vector<std::shared_ptr<theStruct>> theVector
- SWIG:传递一个 std::vector< std::vector <double> >指向 python 的指针
- 将 std::vector<std::p air<const K, V>*> 转换为 std::vector<std::p air<const K, V>&g