更易行算法(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
*/
/**/ /*
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;
}
#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
*/
#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
*/
//
#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
*/