如何使用erase-remove惯用法并在循环中增加迭代器?

时间:2016-09-01 23:10:53

标签: c++ c++11

我想循环浏览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。同样,该代码未显示。

1 个答案:

答案 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());