您可以pop_back一个向量并仍然使用迭代器到最后一个元素吗?

use*_*922 9 c++ iterator vector

我想知道如果在向量的最后一个元素上使用iterator并执行do会发生什么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;
    }
}
Run Code Online (Sandbox Code Playgroud)

上面的代码工作正常(v{1, 2, 3, 4}该块后)至少铿锵,但是它正确检查it == v.end()是否it无效?

Nic*_*las 9

你的直觉是好的;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());
Run Code Online (Sandbox Code Playgroud)