使用remove_if时元素会发生什么?

时间:2018-02-24 07:26:43

标签: c++ erase-remove-idiom

我试图了解remove_if的工作原理(<<是否已超载),为此我想删除所有以&#39; C&#39;开头的字符串:

vector<string> langs = { "Python", "C++", "C", "Java", "C#" };
cout << "Initial vector: " << langs << " | Size = " << langs.size() << endl;

输出Initial vector: Python C++ C Java C# | Size = 5

然后我写道:

auto it = remove_if(begin(langs), end(langs), [](const string& s) 
                                              { return s[0]== 'C';});
cout << "After remove_if: " << langs << " | Size = " << langs.size() << endl;

输出2 After remove_if: Python Java C C# | Size = 5

我的理解:应保留的元素将被移除到开头,而*it现在等于"C"

问题"C++"会发生什么?如果"Java"替换了它,为什么

for(auto& _it = it; _it != end(langs); _it++)
    cout << *_it << " ";

提供输出3 C C#而不是"C", "Java", "C#"

1 个答案:

答案 0 :(得分:0)

remove_if基本上是copy_if的变体,其中目标覆盖了源,并且谓词的意义被颠倒了,以及它实际上并不复制主要元素的优化'不动。如果相关,它还使用移动而不是副本。

因此,所有remove_if实际上都是向下移动(朝向前方)谓词为false的元素。它没有触及那些'遗留'元素,因此它们仍然存在,如果你想要删除它们,你需要使用返回值erase来调用remove_if