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无效?
你的直觉是好的;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)
| 归档时间: |
|
| 查看次数: |
150 次 |
| 最近记录: |