在非唯一集合上使用erase-remove惯用法

Vit*_*meo 3 c++ erase-remove-idiom stl-algorithm c++11

#include <iostream>
#include <vector>
#include <algorithm>

int main()
{
    enum class En{A, B};
    std::vector<En> vec{En::A, En::B, En::A, En::B, En::A, En::B, En::A};

    for(const auto& i : vec) std::cout << int(i) << ", ";
    std::cout << std::endl;

    vec.erase(std::remove(std::begin(vec), std::end(vec), vec.front()), 
              std::end(vec));

    for(const auto& i : vec) std::cout << int(i) << ", ";
    std::cout << std::endl;

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

Ideone:http://ideone.com/NTPVyE

打印:

0,1,0,1,0,1,0,

1,0,0,0,

为什么会这样?不应该只删除矢量的第一个元素吗?

我想std::remove不会停留在第一个元素,而是贯穿整个向量.有没有什么方法可以使用非独特元素的集合上的擦除删除习惯用法

jua*_*nza 7

第三个参数std::removeconst参考.当您移动元素时,您正在更改引用的元素的值,从而导致未定义的行为.

这表现得很好:

auto elem = vec.front(); // copy front element
vec.erase(std::remove(std::begin(vec), std::end(vec), elem), 
          std::end(vec));
Run Code Online (Sandbox Code Playgroud)

输出:

1,1,1,

  • @VittorioRomeo:如果你只想删除那个元素,你不需要算法,你只需要`vec.erase(vec.begin());` (4认同)