//23:44 2010/6/6
……………………………浅谈算法back_inserter,front_inserter,inserter……………………………
#include<iostream>
#include<list>
#include<vector>
#include<algorithm>
using namespace std;
int main()
{
int ia[]={1,2,3,4,100,5,100};
vector<int> ivec(ia,ia+7);
list<int> ilst;
//replace_copy(ivec.begin(),ivec.end(),inserter(ilst,ilst.begin()),100,0);
//replace_copy(ivec.begin(),ivec.end(),back_inserter(ilst),100,0);
//replace_copy(ivec.begin(),ivec.end(),front_inserter(ilst),100,0);
cout<<"list: "<<endl;
for(list<int>::iterator iter=ilst.begin();iter!=ilst.end();++iter)
cout<<*iter<<" ";
cout<<endl;
return 0;
}
注:以上代码的三个//后面的代码分别表示不同的功能,调试的时候可以依次去掉,观察结果的不同。
上面这一段代码是《C++ Primer》第四版中习题11.14的解答题答案。
以上三个结果执行结果依次是 1 2 3 4 0 5 0
1 2 3 4 0 5 0
0 5 0 4 3 2 1
这段代码主要在于帮助理解inserter(),back_inserter(),front_inserter()三个函数实现的不同功
能。
要来理解三个函数就要先知道replace_copy()是做什么的,replace_copy 算法将范围 [first, last)
中所有元素都复制到结果,那么中间的inserter(),back_inserter(),front_inserter()这三个分别
有什么区别呢,看上面的运行结果,大家很容易就看出来了吧,第三个也就是front_inserter()是反向
输出的,为什么呢,应该这样子了理解:
front_inserter()是实现总是在输出序列的前端实现插入,就是说第一个输出的是1,第二个是2,但是
这个2不是在1的后面,而是前面,于是就是2 1,以此类推就不难理解为什么显示结果是0 5 0 4
3 2 1了。
back_inserter()是实现总是在输出序列的末端实现插入,所以也不难理解输出结果是1 2 3 4 0
5 0了。
OK,接下来时inserter(),大家看到上面的程序运行结果第一个和第二个貌似没有区别,为了更好更形象
的理解,我把上面的代码稍微改动几个地方
#include<iostream>
#include<list>
#include<vector>
#include<algorithm>
using namespace std;
int main()
{
int ia[]={1,2,3,4,100,5,100};
vector<int> ivec(ia,ia+7);
list<int> ilst(7,0);
replace_copy(ivec.begin(),ivec.end(),inserter(ilst,ilst.begin()),100,0);
//replace_copy(ivec.begin(),ivec.end(),inserter(ilst,ilst.begin()),100,0);
//replace_copy(ivec.begin(),ivec.end(),inserter(ilst,++ilst.end()),100,0);
cout<<"list: "<<endl;
for(list<int>::iterator iter=ilst.begin();iter!=ilst.end();++iter)
cout<<*iter<<" ";
cout<<endl;
return 0;
}
注:本段代码中初始化了ilst为七个0的容器。
执行结果依次是 1 2 3 4 0 5 0 0 0 0 0 0 0 0
0 1 2 3 4 0 5 0 0 0 0 0 0 0
0 0 0 0 0 0 0 1 2 3 4 0 5 0
这下应该很容易的掌握了back_inserter,front_inserter,inserter着三个算法的区别了吧。
//fromlinge@gmail.com
//fromlinge的C++交流群 8278237