我想循环浏览vector
并每次删除一个项目。我相信我应该使用erase-remove idiom。我相信erase
上的vector
会使其任何迭代器无效。如果是这种情况,我怎样才能在while
循环中使用这个习语?
这是一个破碎的例子:
std::vector<int> vec = { 3, 6, 7, 5 };
auto itr = vec.begin();
while (itr != vec.end())
{
// I'll remove a different element each iteration of the loop.
// Hard-coded "7" here for simplicity:
auto position = std::remove(vec.begin(), vec.end(), 7);
vec.erase(position);
++itr;
}
代码的目的是遍历vector
并每次删除一个元素。我使用while
循环和迭代器,因为向量的大小在每次迭代后都会改变。我将删除每次迭代的最大元素,但我没有显示该代码以使其更简单。因此,元素将按以下顺序删除:7,6,5,3。同样,该代码未显示。
答案 0 :(得分:1)
std::remove()
只需将指定值的所有元素(不是一个元素!)移动到容器的末尾,然后返回新的逻辑过去-end迭代器。 std::remove()
不会使迭代器无效,因为项目物理未被移除,因此容器大小不会更改。只移动容器内的值。
在您“移除”要移除的所有内容后,您最后会在{em>物理移除容器中的那些项目后再拨打erase()
一次。
试试这个:
std::vector<int> vec = { 3, 6, 7, 5 };
auto itr = vec.begin();
auto end = vec.end();
while (itr != end)
{
end = std::remove(vec.begin(), end, ...);
++itr;
}
vec.erase(end, vec.end());