簡體   English   中英

你可以pop_back一個向量,仍然使用迭代器到最后一個元素?

[英]Can you pop_back a vector and still use the iterator to the last element?

我想知道如果我在向量的最后一個元素上有一個迭代器並且執行pop_back會發生什么。

std::set<int> s;
s.insert(5);

std::vector<int> v = {1, 2, 3, 4, 5};

for (auto it = v.begin(); it != v.end();) {
    if (s.count(*it)) {
        std::swap(*it, v.back());
        v.pop_back();
    } else {
        ++it;
    }
}

上面的代碼正常工作( v在該塊之后是{1, 2, 3, 4} )至少使用clang,但是如果it是無效的,檢查它是否正確it == v.end()是否正確?

你的直覺很好; vector::pop_back使迭代器和對最后一個元素的引用無效 如果it是這樣的迭代器,那么它將被無效,因此無法與v.end()進行比較。

通過使用算法和擦除刪除習慣來解決這個問題要好得多:

auto last_it = std::remove_if(v.begin(), v.end(), [&](const auto &val) {return s.count(val) != 0;});
v.erase(last_it, v.end());

暫無
暫無

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

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