我试图了解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#"
?
答案 0 :(得分:0)
remove_if
基本上是copy_if
的变体,其中目标覆盖了源,并且谓词的意义被颠倒了,以及它实际上并不复制主要元素的优化'不动。如果相关,它还使用移动而不是副本。
因此,所有remove_if
实际上都是向下移动(朝向前方)谓词为false的元素。它没有触及那些'遗留'元素,因此它们仍然存在,如果你想要删除它们,你需要使用返回值erase
来调用remove_if
。