浅谈算法back_inserter,front_inserter,inserter

//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

阅读更多
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭