• vector容器经常用法


    容器简单介绍

    定义及初始化

    vector<int> vec(5,100);
    vector<string> strVec(10,"hello");

    末尾插入元素

      vec.push_back(102);
      strVec.push_back("what");

    遍历 size() 函数是能够动态添加的

        for(vector<int>::size_type ix=0;ix<vec.size(); ix++)
        { 
            cout<<vec[ix]<<endl;
            vec.push_back(ix+10);
            cout<<"size is"<<vec.size()<<endl;
            if(vec.size()==10)
            {
              break;
            }
        }
        for(vector<string>::size_type jx=0;jx<strVec.size();jx++)
        {
             cout<<strVec[jx]<<endl;
        }

    通过下标操作添加改变vector内容,不是安全的操作

    vector <int> vec2(10);
        cout<<vec2[9]<<endl;
        cout<<vec2[10]<<endl;

    仅能对已存在元素进行下标操作。不存在会crash

    vector<int> emptyVec;
    //cout<<emptyVec[0]<<endl;    error
    

    将元素一个容器复制给另外一个容器,类型必须匹配。容器类型和元素类型必须同样

        vector<int> vecCopy(vec);
        for(vector<int>::size_type i=0;i<vecCopy.size();i++)
        {
          cout<<vecCopy[i]<<endl;
        }

    迭代器简单介绍

    全部标准库容器都支持迭代器。但仅仅有少数的容器支持下标操作

    定义

        vector<int>::iterator iter;

    begin和end操作

    begin返回迭代器指向的第一个位置,end指向vector的末端元素的下一个

    vector<string>::iterator iBegin=strVec.begin();vector<string>::iterator iEnd=strVec.end();

    迭代器的自增和解引用操作

    ++iter指向第二个元素
    *iter指向当前元素

        cout<<*iBegin<<endl;
        cout<<*(iEnd-1)<<endl;
         for(;iBegin<iEnd;iBegin++)
        {
          cout<<*iBegin<<endl;
        }

    迭代器的算术操作

    iter+n iter-n
    iter1-iter2

        string str("richard");
        *(iBegin+3)=str;
        cout<<*(iBegin+3)<<endl;
            cout<<iEnd-iBegin<<endl;
            vector<string>::iterator     
             mid=iBegin+strVec.size()/2;
        cout<<*mid<<endl ;

    const_iterator 仅仅读

    高级使用方法

    容器元素类型必须满足例如以下两个约束

    元素类型必须支持赋值运算
    元素类型的对象必须能够复制
    除了引用类型和IO标准库类型外。全部内置内置类型和复合类型都支持容器

    顺序容器的操作

    begin() 返回一个迭代器,指向容器的第一个元素
    end()指向最后一个元素 。rbegin()逆序迭代器,指向容器的最后一个元素,rend()指向容器第一个元素前面位置

    加入元素的操作

    list,vector和dequeue支持例如以下操作
    c.push_back(t); 在容器c末尾加入元素
    list和dequeue 支持push_fron(t); 在容器c的最前面加入元素

     list<int> ilist;
        for(size_t ix=0;ix<4;ix++){
            ilist.push_front(ix);
        }
        for(list<int>::iterator iter=ilist.begin();iter!=ilist.end();iter++){
            cout<<*iter<<endl;
        }

    insert操作实现一组更通用的方法,实如今容器内随意制定的位置插入新的元素

    vector<string> strVec;
        //第一种情况 。參数是位置和内容
       strVec.insert(strVec.begin(),"yang");
    
       //另外一种情况,參数是数量和内容
       strVec.insert(strVec.begin(),1,"richard");
       for(int i=0;i<strVec.size();i++){
        // cout<<strVec[i]<<endl;
       }
       //第三种情况,參数是指针
       string sarray[4]={"hello","world","hello","fat"};
       strVec.insert(strVec.begin(),sarray+1,sarray+3);
        for(i=0;i<strVec.size();i++){
         cout<<strVec[i]<<endl;
       }

    避免存储end操作返回的迭代器

    当向vector加入元素时,end失效,内存地址发生了改变,此时千万不用使用存储end操作的迭代器

    关系运算符

    比較的容器必须具有同样的容器类型,并且元素类型也必须同样

    容器大小的操作

    size()返回容器的长度
    empty()标记容器大小是否为零
    resize(n)调整容器大小,使其容纳n个元素。

    font和back操作

    font()返回容器的第一个元素
    back()返回容器的最后一个元素

     vector<int> vec(5,10);
        cout<<vec.front()<<endl;
        vec.push_back(11);
        cout<<vec.back()<<endl;

    删除元素

    1、pop_back()删除容器的最后一个元素。返回void
    2、erase(p)删除迭代器p所指向的元素
    3、erase(b,e)删除迭代器b和e所标记范围内全部的元素,返回一个迭代器,指向被删除元素段后面的元素。假设e本身就是指向末端的下一个位置的迭代器。则返回的迭代器也指向同样的位置
    4、clear() 删除容器内的全部元素

     vector<int> vec(5,10);
        cout<<vec.front()<<endl;
        vec.push_back(11);
        cout<<vec.back()<<endl;
        vec.pop_back();
        cout<<vec.size()<<endl;
        vec.erase(vec.begin());
        cout<<vec.size()<<endl;
        vec.erase(vec.begin(),vec.end());
        cout<<vec.size()<<endl;
        vec.clear();
        cout<<vec.size()<<endl;

    capacity和reserve

    capacity操作获取容器须要分配很多其它空间之前能够存储的元素总数,reserve操作则告诉vector应该预留多少个元素的存储空间

    vector<int> vec(5,10);
        for(int i=0; i<10; i++) {
           vec.push_back(i);
        }
        cout<<vec.capacity()<<endl;
        vector<int> vec2;
        vec2.reserve(30);
        cout<<vec2.capacity()<<endl;
  • 相关阅读:
    hiho 103 平衡树·Treap
    HDU 5738 Eureka
    codeforces 682D Alyona and Strings
    Photoshop cs5 永久序列号
    httpd.exe你的电脑中缺失msvcr110.dll怎么办
    Gzip压缩启用图文方法详细说明
    帝国CMS开启全站搜索功能
    怎么给电脑统一设置查看文件为列表形式?
    帝国CMS网站地图sitemap的制作教程,分享2种帝国cms网站地图模板
    lol安装包打开没反应
  • 原文地址:https://www.cnblogs.com/lcchuguo/p/5276421.html
Copyright © 2020-2023  润新知