C++ STL容器---vector常用方法介绍

1. vector基本概念

  • vector数据结构和数组非常相似,也称为单端数组
  • 不同之处在于数组是静态空间,而vector可以动态扩展
  • 这里的动态拓展并不是在原空间之后续接新空间,而是找更大的内存空间,然后将原数据拷贝新空间,释放原空间(因此应该提前估计数据大小,避免频繁地拷贝和释放原空间)
  • vector容器的迭代器是支持随机访问的迭代器(数组当然可以随机访问)

2. vector构造函数

  1. vector<T> v; : 采用模板实现类实现,默认构造函数

    vector<int> v;
    
  2. vector<T> v(int cap); : 指定容器容量, 创建10个默认值为0的容器

    vector<int> v(10);
    
  3. vector(v.begin(), v.end()); : 将另外一个vector v[begin(), end())区间中的元素拷贝给本身

    	vector<int> v1;
        v1.push_back(1);
        v1.push_back(2);
        vector<int> v2(v1.begin(),v1.end());	
    
  4. vector(n, elem);: 构造函数将n个elem拷贝给本身

     	vector<int> v(3,6);//6 6 6
    
  5. vector(const vector &vec); : 拷贝构造函数

     	vector<int> v1(3,6);
        vector<int> v2(v1);
    

3. vector赋值操作

  1. vector& operator=(const vector &vec);: 重载等号操作符, 可以将另外一个vector赋值给自身

        vector<int> v1(3,6);
        vector<int> v2=v1;
    
  2. assign(beg, end); : 将[beg, end)区间中的数据拷贝赋值给本身

        vector<int> v1;
        v1.push_back(1);
        v1.push_back(2);
        v1.push_back(3);
        vector<int> v2;
        v2.assign(v1.begin(),v1.end());
    
  3. assign(n, elem);: 将n个elem拷贝赋值给本身

    	vector<int> v1;
        v1.assign(5,6);
    

4. vector容量和大小

  1. empty(); : 判断容器是否为空

     	vector<int> v;
        vector<int> v;
        cout<<v.empty()<<endl;//1
        v.push_back(1);
        cout<<v.empty()<<endl;//0
    
  2. capacity(); : 容器的容量

      	vector<int> v(10);//指定容量大小为10
        cout<<v.capacity()<<endl;//10
    
  3. size(); : 返回容器中元素的个数

     	vector<int> v={
          
          1,2,3};
        cout<<v.size()<<endl;//3
    
  4. resize(int num); :重新指定容器的长度为num,若容器变长,则以默认值(int类型为0)填充新位置。如果容器变短,则末尾超出容器长度的元素被删除

     vector<int> v={
          
          1,2,3};
     v.resize(2);//1 2
     v.resize(5);//1 2 0 0 0
    
  5. resize(int num, elem); : 重新指定容器的长度为num,若容器变长,则以指定elem值填充新位置如果容器变短,则末尾超出容器长度的元素被删除

      	vector<int> v={
          
          1,2,3};
        v.resize(2,99);//1 2
        v.resize(5,99);//1 2 99 99 99
    

容器的capacity不等于size, size<=capacity, capacity是开辟的可以最多存放的元素个数,size是容器实际存放的元素个数


5. vector插入和删除

  1. push_back(ele);: 尾部插入元素ele

        vector<int> v;
        v.push_back(1);
        v.push_back(2);//1 2
    
  2. pop_back(); : 删除最后一个元素

     	vector<int> v;
        v.push_back(1);
        v.push_back(2);//1 2
        v.pop_back();//1
    
  3. insert(const_iterator pos, ele);: 迭代器指向位置pos插入元素ele

       vector<int> v={
          
          1,2,3,4,5,6};
        int pos=0;
        for(vector<int>::iterator it=v.begin();it!=v.end();it++)
        {
          
          
            if(pos==1){
          
          //向下标1的位置插入元素22
                v.insert(it,22);
            }
            pos++;
    
        }
        print_vector(v);//1 22 2 3 4 5 6
    
    
  4. insert(const_iterator pos, int count,ele); : 迭代器指向位置pos插入count个元素ele

    	vector<int> v={
          
          1,2,3,4,5,6};
        int pos=0;
        for(vector<int>::iterator it=v.begin();it!=v.end();it++)
        {
          
          
            if(pos==1){
          
          
                v.insert(it,2,22);//向下标1的位置插入2个元素22
            }
            pos++;
    
        }
        print_vector(v);//1 22 22 2 3 4 5 6
    
  5. erase(const_iterator pos); : 删除迭代器指向的元素

     	vector<int> v={
          
          1,2,3,4,5,6};
        int pos=0;
        for(vector<int>::iterator it=v.begin();it!=v.end();it++)
        {
          
          
            if(pos==1){
          
          
                v.erase(it);//删除下标为1的元素2
            }
            pos++;
        }
        print_vector(v);//1 3 4 5 6
    
  6. erase(const_iterator start, const_iterator end);: 删除迭代器从start到end之间的元素

     	vector<int> v={
          
          0,1,2,3,4,5};
        vector<int>::iterator start_iter;
        vector<int>::iterator end_iter;
        int pos=0;
        for(vector<int>::iterator it=v.begin();it!=v.end();it++)
        {
          
          
            if(pos==1){
          
          
                start_iter=it;//开始区间位置为下标1
            }
            if(pos==3){
          
          
                end_iter=it;//结束区间位置为下标3
            }
            pos++;
    
        }
        v.erase(start_iter,end_iter);//左闭右开 删除区间[1,3)中的元素
        print_vector(v);//0 3 4 5
    
  7. clear(); : 删除容器中所有元素

        vector<int> v={
          
          0,1,2,3,4,5};
        v.clear();
    

6. vector数据存取

  1. at(int idx); : 返回索引idx所指的数据

    	vector<int> v={
          
          0,1,2,3,4,5};
        cout<<v.at(2)<<endl;//2
    
  2. operator[]; : 返回索引idx所指的数据, 重写了[]运算符

     	vector<int> v={
          
          0,1,2,3,4,5};
        cout<<v[2]<<endl;//2
    
  3. front(); : 返回容器中第一个数据元素

    	vector<int> v={
          
          0,1,2,3,4,5};
        cout<<v.front()<<endl;//0
    
  4. back();: 返回容器中最后一个数据元素

     	vector<int> v={
          
          0,1,2,3,4,5};
        cout<<v.back()<<endl;//5
    

7. vector互换容器

swap(vec); : 将另外一个vector容器与本身的元素互换

	vector<int> v1= {
    
    0,1,2,3,4,5};
    vector<int> v2= {
    
    2,1,0};
    cout<<v1.capacity()<<endl;//6
    cout<<v2.capacity()<<endl;//3
    v1.swap(v2);
    print_vector(v1);//2 1 0
    print_vector(v2);//0 1 2
    cout<<v1.capacity()<<endl;//3
    cout<<v2.capacity()<<endl;//6
  • 交换元素的同时,容器的capacity也发生了改变

8. vector预留空间

  • 减少vector在动态扩展容量时的扩展次数
  • reserve(int len);: 容器预留len个元素长度,预留位置不初始化,元素不可访问。
 	vector<int> v;
    cout<<"size: "<<v.size()<<"  capacity: "<<v.capacity()<<endl;//0 0
    v.reserve(3);
    cout<<"size: "<<v.size()<<"  capacity: "<<v.capacity()<<endl;//0 3

猜你喜欢

转载自blog.csdn.net/qq_43478694/article/details/127486327