![](/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.