c ++ STL remove-if算法和擦除算法问题.

Omk*_*kar 0 c++ stl vector

目的:创建一个向量.在它上面使用remove_if

#include<iostream>
#include<vector>
#include<iterator>
#include<algorithm>
#include<functional>
using namespace std;
int main()
{
    int negative_count=0;
    vector<int> v = { 2, -1, -3, 5, -5, 0, 7 };
    copy(v.begin(), v.end(), ostream_iterator<int>(cout, " "));
    cout << endl;

    vector<int>::iterator new_it=remove_if(v.begin(), v.end(), bind2nd(greater<int>(), -1));
    v.erase(new_it);
    copy(v.begin(), v.end(), ostream_iterator<int>(cout, " "));
    cout << endl;


}
Run Code Online (Sandbox Code Playgroud)

输出:产量

remove_if条件是删除大于-1的数字.为什么显示-5两次?remove_if之后的输出应该是-1 -3 -5 5 0 7.如果我使用的话

V.erase(new_int,v.end())
Run Code Online (Sandbox Code Playgroud)

输出很好:-1 -3 -5

Ben*_*ley 5

当您调用时std::remove/remove_if,它会将不满足条件的元素移动到范围的前面.未指定任何剩余元素的值(从返回的迭代器的位置开始).有些人似乎认为它交换元素使得满足条件的元素移动到后面.但是没有指定算法来执行此操作.如果这是您想要的结果,那么您正在寻找的算法是std::partition.