Forever
Do not lose heart,you will be successful sooner or later。

STL的移除性算法只是在逻辑上的删除,其实际上只是将符合条件的元素用后面的元素覆盖掉了。返回的位置是最后一个不符合条件的下一个位置。

移除性的算法主要有:

remove

remove_if

remove_copy

remove_copy_if

copy和没有copy的区别是copy的时候会移除与value 相等的元素

unique

unique_copy

其中unique和unique_copy都有自己的重载版本。重载版本主要是含有仿函数

相当于_if了,不知道为什么当时不是直接加_if 而是重载

unique的重载版本和普通版本的区别是:

比较方式有点不同,unique普通版本用来和前一个元素比较,如果是相等的,则取除;所以,若果要将序列式容器中所有相同的元素去除掉,必选先进行排序。要是一个有序的序列;

重载的版本中仿函数的比较是和前一个未删除的元素比较。

另外的一个注意点是stl的移除性算法会改变元素的位置,所以关联容器是不适应的

示例代码:

// stlsample.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <vector>
#include <algorithm>
#include <iostream>
#include <iterator>
#include <set>
using namespace std;

void print(const vector<int>& vec){
    vector<int>::const_iterator iter = vec.begin();
    for(; iter != vec.end(); ++iter){
      cout << (*iter) <<",";
    }
    cout << endl;
}
int _tmain(int argc, _TCHAR* argv[])
{
    vector<int> vec;
    vec.push_back(2);
    vec.push_back(3);
    vec.push_back(4);
    vec.push_back(5);
    vec.push_back(6);
    vec.push_back(7);
    vec.push_back(8);
    vec.push_back(9);
    vec.push_back(5);
    vec.push_back(6);
    vec.push_back(5);
    vec.push_back(4);
    std::vector<int>::iterator iter;
    //iter = remove(vec.begin(), vec.end(), 5);
    //print(vec);

    //vec.erase(iter, vec.end());
    //print(vec);
//
    //vec.erase(remove_if(vec.begin(), vec.end(), bind2nd(less<int>(), 4)), vec.end());
    //print(vec);

    //remove_copy  remove_copy_if

    remove_copy(vec.begin(), vec.end(), ostream_iterator<int>(cout, " "), 3);
    remove_copy_if(vec.begin(), vec.end(), ostream_iterator<int>(cout, " "), bind2nd(less<int>(), 4));

    multiset<int> mul_set;
    remove_copy_if(vec.begin(), vec.end(), inserter(mul_set, mul_set.end()), bind2nd(greater<int>(), 4));

    return 0;
}

posted on 2012-04-21 15:43  sybtj  阅读(241)  评论(0编辑  收藏  举报