zoukankan      html  css  js  c++  java
  • 【STL】vector容器

    vector容器简介

    • vector是将元素置于一个动态数组中加以管理的容器。
    • vector可以随机存取元素(支持索引值直接存取, 用[]操作符或at()方法,)。
    • vector尾部添加或移除元素非常快速。但是在中部或头部插入元素或移除元素比较费时

    vector对象的默认构造

    vector采用模板类实现
    vector vecT; //vector对象的默认构造形式

    vector vecInt; //一个存放int的vector容器。
    vector vecFloat; //一个存放float的vector容器。
    vector vecString; //一个存放string的vector容器。
    ... //尖括号内还可以设置指针类型或自定义类型。
    Class CA{};
    vector<CA*> vecpCA; //用于存放CA对象的指针的vector容器。
    vector vecCA; //用于存放CA对象的vector容器。由于容器元素的存放是按值复制的方式进行的,所以此时CA必须提供CA的拷贝构造函数,以保证CA对象间拷贝正常。


    vector对象的带参数构造

    • vector(beg,end); //构造函数将[beg, end)区间中的元素拷贝给本身。注意该区间是左闭右开的区间。
    • vector(n,elem); //构造函数将n个elem拷贝给本身。
    • vector(const vector &vec); //拷贝构造函数

    int iArray[] = {0,1,2,3,4};

    vector vecIntA( iArray, iArray+5 ); //从iArray[0]开始,拷贝5个元素的值给veclntA
    vector vecIntB ( vecIntA.begin() , vecIntA.end() ); //用构造函数初始化容器vecIntB
    vector vecIntB ( vecIntA.begin() , vecIntA.begin()+3 );
    vector vecIntC(3,9); //此代码运行后,容器vecIntB就存放3个元素,每个元素的值是9。
    vector vecIntD(vecIntA);


    vector的赋值

    • vector.assign(beg,end); //将[beg, end)区间中的数据拷贝赋值给本身。注意该区间是左闭右开的区间。
    • vector.assign(n,elem); //将n个elem拷贝赋值给本身。
    • vector& operator=(const vector &vec); //重载等号操作符
    • vector.swap(vec); // 将vec与本身的元素互换。

    vector vecIntA, vecIntB, vecIntC, vecIntD;
    int iArray[] = {0,1,2,3,4};

    vecIntA.assign(iArray,iArray+5);
    vecIntB.assign( vecIntA.begin(), vecIntA.end() ); //用其它容器的迭代器作参数。
    vecIntC.assign(3,9);
    vector vecIntD;
    vecIntD = vecIntA;
    vecIntA.swap(vecIntD);


    vector的大小

    • vector.size(); //返回容器中元素的个数
    • vector.empty(); //判断容器是否为空
    • vector.resize(num); //重新指定容器的长度为num,若容器变长,则以默认值填充新位置。如果容器变短,则末尾超出容器长度的元素被删除。
    • vector.resize(num, elem); //重新指定容器的长度为num,若容器变长,则以elem值填充新位置。如果容器变短,则末尾超出容器长度的元素被删除。

    例如 vecInt是vector 声明的容器,现已包含1,2,3元素。
    int iSize = vecInt.size(); //iSize == 3;
    bool bEmpty = vecInt.empty(); // bEmpty == false;
    执行vecInt.resize(5); //此时里面包含1,2,3,0,0元素。
    再执行vecInt.resize(8,3); //此时里面包含1,2,3,0,0,3,3,3元素。
    再执行vecInt.resize(2); //此时里面包含1,2元素。


    vector末尾的添加移除操作

    vector vecInt;

    vecInt.push_back(1); //在容器尾部加入一个元素
    vecInt.push_back(3);
    vecInt.push_back(5);
    vecInt.push_back(7);
    vecInt.push_back(9);

    vecInt.pop_back(); //移除容器中最后一个元素
    vecInt.pop_back();
    //{1,3,5}


    vector的数据存取

    • vec.at(idx); //返回索引idx所指的数据,如果idx越界,抛出out_of_range异常。
    • vec[idx]; //返回索引idx所指的数据,越界时,运行直接报错

    vector vecInt; //假设包含1 ,3 ,5 ,7 ,9
    vecInt.at(2) == vecInt[2] ; //5
    vecInt.at(2) = 8; 或 vecInt[2] = 8; //vecInt 就包含 1, 3, 8, 7, 9值

    int iF = vecInt.front(); //获取头部元素,iF==1
    int iB = vecInt.back(); //获取尾部元素,iB==9
    vecInt.front() = 11; //vecInt包含{11,3,8,7,9}
    vecInt.back() = 19; //vecInt包含{11,3,8,7,19}


    vector的插入

    • vector.insert(pos,elem); //在pos位置插入一个elem元素的拷贝,返回新数据的位置。

    • vector.insert(pos,n,elem); //在pos位置插入n个elem数据,无返回值。

    • vector.insert(pos,beg,end); //在pos位置插入[beg,end)区间的数据,无返回值

    简单案例

    vector vecA;
    vector vecB;

    vecA.push_back(1);
    vecA.push_back(3);
    vecA.push_back(5);
    vecA.push_back(7);
    vecA.push_back(9);
    vecB.push_back(2);
    vecB.push_back(4);
    vecB.push_back(6);
    vecB.push_back(8);

    vecA.insert(vecA.begin(), 11); //{11, 1, 3, 5, 7, 9}
    vecA.insert(vecA.begin()+1,2,33); //{11,33,33,1,3,5,7,9}
    vecA.insert(vecA.begin() , vecB.begin() , vecB.end() ); //{2,4,6,8,11,33,33,1,3,5,7,9}


    vector的删除

    • vector.clear(); //移除容器的所有数据
    • vec.erase(beg,end); //删除[beg,end)区间的数据,返回下一个数据的位置。
    • vec.erase(pos); //删除pos位置的数据,返回下一个数据的位置。
      简单案例:
      删除区间内的元素
      vecInt是用vector声明的容器,现已包含按顺序的1,3,5,6,9元素。
      vector::iterator itBegin=vecInt.begin()+1;
      vector::iterator itEnd=vecInt.begin()+2;
      vecInt.erase(itBegin,itEnd);
      //此时容器vecInt包含按顺序的1,6,9三个元素。

    //vector(动态数组)容器功能介绍
    #include<iostream>
    #include "vector"
    
    using namespace std;
    
    int main1()
    {
        vector<int> a;
        cout << "a的长度" << a.size() << endl;
        a.push_back(1);
        a.push_back(2);
        a.push_back(3);
    
        //函数返回值当左值 应该返回一个引用
        a.front() = 10;
        a.back() = 100;
    
        cout << "a的长度" << a.size() << endl;
        cout << "a的首元素" << a.front() << endl;
        while (a.size() != 0)
        {
            cout << "back " << a.back();
            a.pop_back();
        }
    }
    
    //输出容器内的所有元素  数组的方式,也可以用迭代器
    void print(vector<int> &V)
    {
        for (int i = 0; i < V.size(); i++)
        {
            cout << V[i] << " ";
        }
    }
    
    //vector的初始化
    int main2()
    {
        vector<int> v1;
        v1.push_back(1);
        v1.push_back(2);
        v1.push_back(3);
        v1.push_back(4);
    
        vector<int> v2 = v1;
    
        vector<int> v3(v1.begin(), v1.begin() + 2);  //2个元素进入容器
        print(v3);
    }
    
    //vector的遍历 通过数组的方式
    int main3()
    {
        vector<int> v1(10);  //提前把内存准备好
        for (int i = 1; i < 3; i++)
        {
            v1[i] = i + 1;
        }
    
        print(v1);
    }
    
    
    //1.迭代器的理解
    //    1   2   3
    //    ▲           ▲
    //begin()        end()
    //当 it == v1.end()的时候 说明这个容器已经遍历完毕了...
    //end()的位置 应该是3的后面
    
    //2 迭代器的种类
    /*
    typedef iterator pointer;
    typedef const_iterator const_pointer;
    typedef _STD reverse_iterator<iterator> reverse_iterator;
    typedef _STD reverse_iterator<const_iterator> const_reverse_iterator;
    */
    
    int main4()  //输出容器内的所有元素  迭代器方式
    {
        vector<int> v1(10);
        for (int i = 1; i < 3; i++)
        {
            v1[i] = i + 1;
        }
    
        //正序遍历
        for (vector<int>::iterator it = v1.begin(); it != v1.end(); it++)
        {
            cout << *it << " ";
        }
    
        //逆序遍历
        for (vector<int>::reverse_iterator it = v1.rbegin(); it != v1.rend(); it++)
        {
            cout << *it << " ";
        }
    }
    
    //push_back强化记忆 从尾部添加元素
    int  main5()
    {
        vector<int> v(10);  //提前把内存准备好
        v.push_back(100);
        v.push_back(200);
    
        cout << "size" << v.size() << endl;
    
        print(v);
    }
    
    //vector的删除操作:区间删除 指定位置删除 根据元素值删除
    int main6()
    {
        vector<int> v1(10);
        for (int i = 1; i < 8; i++)
        {
            v1[i] = i + 1;
        }
        print(v1);
    
        //区间删除
        v1.erase(v1.begin(), v1.begin() + 3);
        print(v1);
    
        //指定位置删除
        v1.erase(v1.begin()+1);  //删除首元素
        cout<<endl;
    
        //根据元素值删除
        for(vector<int>::iterator it=v1.begin();it!=v1.end();)
        {
            if(*it==8)
                it=v1.erase(it);
            else
                it++;
        }
        print(v1);
    }
    
    int main()
    {
    //    main1();
    //    main2();
    //    main3();
    //    main4();
    //    main5();
        main6();
        return 0;
    }
    
    
  • 相关阅读:
    android 图片全屏
    .9.png
    C++中的endl
    C++输入输出cin与cout
    word-search
    Java中的的画正三角方法
    octave中的一些基本操作
    C#中判断语句 if、if-else if、switch-case
    C#中的异常处理(try-catch的使用)——使程序更加稳定
    编程&blog处女篇-用C#求100以内的质数
  • 原文地址:https://www.cnblogs.com/tazimi/p/13322050.html
Copyright © 2011-2022 走看看