zoukankan      html  css  js  c++  java
  • back_insert_iterator和iterator用起来不一样。

    先看代码:

    #include<iostream>
    #include<vector>
    #include<algorithm>
    #include<iterator>
    using namespace std;
    int main()
    {
        vector<int> coll;
        //create back_inserter for coll
        // - inconvenient way
        back_insert_iterator<vector<int> > iter(coll);
    
        //insert elements with the usual iterator interface
        *iter =1;
        iter++;
        *iter =2;
        iter++;
        *iter = 3;
        copy(coll.begin(),coll.end(),ostream_iterator<int>(cout,", "));
        cout<<endl;
    
        //create back inserter and insert elements;
        //- convenient way
        back_inserter(coll) = 44;
        back_inserter(coll) = 55;
        copy(coll.begin(),coll.end(),ostream_iterator<int>(cout,", "));
        cout<<endl;
    
        //use back inserter to append all elements again
        //reserve enough memory to avoid reallocation 
        coll.reserve(2*coll.size());
        copy(coll.begin(),coll.end(),//source
            back_inserter(coll));//destination
        copy(coll.begin(),coll.end(),ostream_iterator<int>(cout,", "));
        cout<<endl;
    }

    上面代码中的这一行:

    back_insert_iterator<vector<int> > iter(coll);

    定义了一个适配器。个人觉得也是属于iterator,用法应该差不多,于是依葫芦画瓢,写了如下一段代码,定义一个iterator:

    iterator<vector<int> > iter1(coll);

    结果报错:error C2976: “std::iterator”: 模板 参数太少。

    看了iterator源代码,水平有限,只知道是少了参数,具体应该怎么补救不知道了。后来想了想,一般定义一个iterater一般都用如下形式:

    vector<int>::iterator iter1;
    iter1 = coll.begin();

    跟back_insert_iterator的定义方式完全不一样,我觉得应该是back_insert_iterator不是属于某个容器的一部分,应该是个独立于容器之外的东东。这个也许是它们的定义方式不同的原因所在。

  • 相关阅读:
    Hdu 2564 单词缩写(字符串输入流的使用)
    Hdu2824 快速求欧拉函数和
    hdu 1787 欧拉函数模板
    Hdu2558(欧拉函数)
    hdu 1175连连看 (bfs带方向变化次数)
    pandas 使用总结
    APScheduler 定时任务使用总结
    watchdog 监控文件变化使用总结
    js 鼠标特效
    js 生成雪花间隔
  • 原文地址:https://www.cnblogs.com/VIPler/p/4379502.html
Copyright © 2011-2022 走看看