0

我试图了解如何remove_if工作(<<重载),为此我想 remove_if 所有以“C”开头的字符串:

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;

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

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

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

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

给出输出 3C C#而不是"C", "Java", "C#"

4

1 回答 1

0

remove_if基本上是copy_if目标覆盖源的变体,谓词的意义是相反的,以及一个优化,如果它们不移动,它实际上不会复制前导元素。如果相关的话,它还使用移动而不是复制。

所以remove_if真正要做的就是向下移动(朝向前面)谓词为假的元素。它不会触及那些“剩余”元素,所以它们仍然存在,如果你想摆脱它们,你需要erase使用返回值调用。remove_if

于 2018-02-24T19:08:50.587 回答