3
#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;
}

イデオネ: http://ideone.com/NTPVyE

版画:

0、1、0、1、0、1、0、

1、0、0、0、

なぜこうなった?ベクトルの最初の要素だけを削除するべきではありませんか?

std::remove最初の要素で止まらず、ベクトル全体を通過すると思います。一意でない要素を持つコレクションで消去削除イディオムを使用する方法はありますか?

4

1 に答える 1

7

の 3 番目の引数std::removeconst参照です。要素を移動すると、参照される要素の値が変更され、未定義の動作が発生します。

これは行儀が良いでしょう:

auto elem = vec.front(); // copy front element
vec.erase(std::remove(std::begin(vec), std::end(vec), elem), 
          std::end(vec));

出力:

1、1、1、

于 2014-01-12T11:30:35.040 に答える