簡體   English   中英

在映射擦除 C++ 期間執行循環的次數

[英]How many times a loop is executed during map erase c++

void main() {
        map<int, int> m;
        m[1] = 1;
        m[2] = 1;
        for (auto it : m) {
            cout<<"current: "<<it.first<<endl;
            m.erase(1);
            m.erase(2);
        }
    }

猜猜這個循環執行了多少次? 是2!

但是,如果我刪除“m.erase(1)”,則循環執行一次。

我對為什么循環執行兩次感到困惑?

std::map::erase將使被擦除元素的迭代器無效。 之后,無效迭代器用於 for range 循環中的增量操作,這會調用未定義的行為。 所以你基本上無法判斷它執行循環的次數。

正確的片段如下所示:

for(auto it = m.begin(); it != m.end(); )
        if( /*condition */ )
            it = m.erase(it);
        else
            ++it;

我對為什么循環執行兩次感到困惑?

循環中的擦除操作使循環中使用的迭代器無效。 使用無效迭代器的行為是未定義的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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