更易行算法(manipulating algorithms)指能够删除或者重排或者修改元素的算法。
//stl/remove1.cpp


/**//*
remove 并不改变群集中的元素数量,end()返回的是当初的那个终点,size()返回原来的size。
*/
#include <iostream>
#include <list>
#include <algorithm>
using namespace std;

int main()

...{
list<int> coll;

for(int i =1;i<=6;++i)

...{
coll.push_front(i);
coll.push_back(i);
}

cout <<"pre: ";
copy(coll.begin(),coll.end(),ostream_iterator<int>(cout," "));
cout <<endl;


/**//* remove 后,数值为3的元素被其后的元素覆盖了,元素相当于前移,但是群集尾端的元素位置不变了,原封不动
** 但是逻辑上来说不属于这个群集了。
*/
remove(coll.begin(),coll.end(),3);

cout <<"post: ";
// 这时候输出 6 5 4 2 1 1 2 4 5 6 5 6,最后两位不变,原封不动。
copy(coll.begin(),coll.end(),ostream_iterator<int>(cout," "));
cout <<endl;
}
// Out Result


/**//*
** pre: 6 5 4 3 2 1 1 2 3 4 5 6
** post: 6 5 4 2 1 1 2 4 5 6 5 6
*/
//stl/remvoe2.cpp
#include <iostream>
#include <list>
#include <algorithm>
using namespace std;

int main()

...{
list<int> coll;

for(int i =1; i<=6;++i)

...{
coll.push_front(i);
coll.push_back(i);
}

// 原始数据
copy(coll.begin(),coll.end(),ostream_iterator<int>(cout," "));
cout <<endl;

// 对整个群集进行遍历,把所有value为3 的值都删掉,最后的位置为删除所有元素后
// 的逻辑终点,这个终点在往后的元素不包含在群集以内。
list<int>::iterator end = remove(coll.begin(),coll.end(),3);

// 打印出来
copy(coll.begin(),end,ostream_iterator<int>(cout," "));
cout << endl;

// 逻辑终点与 coll.end() 的距离,本例是 2
cout <<"number of removed elements: "
<<distance(end,coll.end())
<<endl;
// erase 会删除整个区间内的所有的元素
coll.erase(end,coll.end());
// 打印出来
copy(coll.begin(),coll.end(),ostream_iterator<int>(cout," "));
cout <<endl;
}
//stl / remove3.cpp
#include <iostream>
#include <set>
#include <algorithm>
using namespace std;

int main()

...{
set<int> coll;

for(int i =1; i<=9;++i)

...{
coll.insert(i);
}
copy(coll.begin(),coll.end(),ostream_iterator<int>(cout," "));

cout <<endl;


/**//* 书上说更易行算法用在set 这种关联式容器上 会出问题
** 不过这里好像没出错,以后再仔细研究下,从关联是容器中删除元素,用本
** 身提供的成员函数比较好
*/



/**//*
set<int>::iterator pos;
pos = remove(coll.begin(),coll.end(),3);
*/

// 成员函数的erase,删除元素为3,记录下删除了多少。
size_t num = coll.erase(3);
cout <<"number of removed elements: "<<num<<endl;
copy(coll.begin(),coll.end(),ostream_iterator<int>(cout," "));
cout <<endl;
}


/**//*
1 2 3 4 5 6 7 8 9
number of removed elements: 1
1 2 4 5 6 7 8 9
*/
//stl/remove4.cpp
//
#include <iostream>
#include <list>
#include <algorithm>
using namespace std;

int main()

...{
list<int> coll;

for(int i =1; i<6;++i)

...{
coll.push_front(i);
coll.push_back(i);
}

cout <<"原始数据:";
copy(coll.begin(),coll.end(),ostream_iterator<int>(cout," "));
cout <<endl;
coll.erase(remove(coll.begin(),coll.end(),3),coll.end());

// 效率比较低的移除方法,先移动,在擦除逻辑群集意外的元素
cout <<"remove value 3: ";
copy(coll.begin(),coll.end(),ostream_iterator<int>(cout," "));
cout <<endl;


// 直接删除,效率比较好
cout <<"remove value 4: ";
coll.remove(4);
copy(coll.begin(),coll.end(),ostream_iterator<int>(cout," "));
cout <<endl;
}


/**//*
原始数据:5 4 3 2 1 1 2 3 4 5
remove value 3: 5 4 2 1 1 2 4 5
remove value 4: 5 2 1 1 2 5
*/