簡體   English   中英

遞減 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()向量為空,我們立即退出循環
  • if 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM