Loading

【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;
}

posted @ 2020-07-16 12:43  tazimi  阅读(97)  评论(0编辑  收藏  举报