• C++ vector使用方法


    一、什么是vector?

    向量(vector)是一个封装了动态大小数组的顺序容器(Sequence Container)。跟任意其它类型容器一样,它能够存放各种类型的对象。可以简单的认为,向量是一个能够存放任意类型的动态数组

    二、容器特性

    1.顺序序列
    顺序容器中的元素按照严格的线性顺序排序。可以通过元素在序列中的位置访问对应的元素。

    2.动态数组
    支持对序列中的任意元素进行快速直接访问,甚至可以通过指针算述进行该操作。操供了在序列末尾相对快速地添加/删除元素的操作。

    3.能够感知内存分配器的(Allocator-aware)
    容器使用一个内存分配器对象来动态地处理它的存储需求。

    三、基本函数实现

    1.构造函数

    vector():创建一个空vector
    
    • 1
    vector(int nSize):创建一个vector,元素个数为nSize
    
    • 1
    vector(int nSize,const t& t):创建一个vector,元素个数为nSize,且值均为t
    
    • 1
    vector(const vector&):复制构造函数
    
    • 1
    vector(begin,end):复制[begin,end)区间内另一个数组的元素到vector中
    
    • 1

    2.增加函数

    void push_back(const T& x):向量尾部增加一个元素X
    
    • 1
    ​iterator insert(iterator it,const T& x):向量中迭代器指向元素前增加一个元素x
    
    • 1
    ​iterator insert(iterator it,int n,const T& x):向量中迭代器指向元素前增加n个相同的元素x
    
    • 1
    ​iterator insert(iterator it,const_iterator first,const_iterator last):向量中迭代器指向元素前插入另一个相同类型向量的[first,last)间的数据
    
    • 1

    3.删除函数

    ​iterator erase(iterator it):删除向量中迭代器指向元素
    
    • 1
    ​iterator erase(iterator first,iterator last):删除向量中[first,last)中元素
    
    • 1
    void pop_back():删除向量中最后一个元素
    
    • 1
    void clear():清空向量中所有元素
    
    • 1

    4.遍历函数

    ​reference at(int pos):返回pos位置元素的引用
    
    • 1
    ​reference front():返回首元素的引用
    
    • 1
    ​reference back():返回尾元素的引用
    
    • 1
    ​iterator begin():返回向量头指针,指向第一个元素
    
    • 1
    ​iterator end():返回向量尾指针,指向向量最后一个元素的下一个位置
    
    • 1
    ​reverse_iterator rbegin():反向迭代器,指向最后一个元素
    
    • 1
    ​reverse_iterator rend():反向迭代器,指向第一个元素之前的位置
    
    • 1

    5.判断函数

    bool empty() const:判断向量是否为空,若为空,则向量中无元素
    
    • 1

    6.大小函数

    int size() const:返回向量中元素的个数
    
    • 1
    int capacity() const:返回当前向量所能容纳的最大元素值
    
    • 1
    int max_size() const:返回最大可允许的 vector 元素数量值
    
    • 1

    7.其他函数

    void swap(vector&):交换两个同类型向量的数据
    
    • 1
    void assign(int n,const T& x):设置向量中前n个元素的值为x
    
    • 1
    void assign(const_iterator first,const_iterator last):向量中[first,last)中元素设置成当前向量元素
    
    • 1

    8.看着清楚

    push_back 在数组的最后添加一个数据
    
    • 1
    pop_back 去掉数组的最后一个数据
    
    • 1
    at 得到编号位置的数据
    
    • 1
    begin 得到数组头的指针
    
    • 1
    end 得到数组的最后一个单元+1的指针
    
    • 1
    front 得到数组头的引用
    
    • 1
    back 得到数组的最后一个单元的引用
    
    • 1
    max_size 得到vector最大可以是多大
    
    • 1
    capacity 当前vector分配的大小
    
    • 1
    size 当前使用数据的大小
    
    • 1
    resize 改变当前使用数据的大小,如果它比当前使用的大,填充默认值
    
    • 1
    reserve 改变当前vecotr所分配空间的大小
    
    • 1
    erase 删除指针指向的数据项
    
    • 1
    clear 清空当前的vector
    
    • 1
    rbegin 将vector反转后的开始指针返回(其实就是原来的end-1)
    
    • 1
    rend 将vector反转构的结束指针返回(其实就是原来的begin-1)
    
    • 1
    empty 判断vector是否为空
    
    • 1
    swap 与另一个vector交换数据
    
    • 1

    四、基本用法

    #include < vector> 
    using namespace std;
    
    • 1
    • 2

    五、简单介绍

    vector<类型>标识符
    vector<类型>标识符(最大容量)
    vector<类型>标识符(最大容量,初始所有值)
    Int i[5]={1,2,3,4,5}vector<类型>vi(I,i+2);//得到i索引值为3以后的值
    vector< vector< int> >v; 二维向量//这里最外的<>要有空格。否则在比较旧的编译器下无法通过
    
    • 1
    • 2
    • 3
    • 4
    • 5

    六、vector使用实例

    使用vector注意事项:

    1、如果你要表示的向量长度较长(需要为向量内部保存很多数),容易导致内存泄漏,而且效率会很低;

    2、vector 作为函数的参数或者返回值时,需要注意它的写法:

    double Distance(vector<int>&a, vector<int>&b)
    
    • 1

    其中的“&”绝对不能少!!!

    vector对象的定义和初始化
    同样的,使用前,导入头文件 #include 可以使用using声明:using std::vector;vector 是一个类模板(class template)。使用模板可以编写一个类定义或函数定义,而用于多个不同的数据类型。因此,我们可以定义保存 string 对象的 vector,或保存 int 值的 vector,又或是保存自定义的类类型对象(如 Sales_items 对象)的 vector。
    声明从类模板产生的某种类型的对象,需要提供附加信息,信息的种类取决于模板。以 vector 为例,必须说明 vector 保存何种对象的类型,通过将类型放在类型放在类模板名称后面的尖括号中来指定类型:

    vector v1;保存类型为 T 对象。默认构造函数 v1 为空。
    vector v2(v1);v2 是 v1 的一个副本。
    vector v3(n, i);v3 包含 n 个值为 i 的元素。
    vector v4(n);v4 含有值初始化的元素的 n 个副本。

    【注意:1、若要创建非空的 vector 对象,必须给出初始化元素的值;2、当把一个 vector 对象复制到另一个 vector 对象时,新复制的 vector 中每一个元素都初始化为原 vectors 中相应元素的副本。但这两个 vector 对象必须保存同一种元素类型;3、可以用元素个数和元素值对 vector 对象进行初始化。构造函数用元素个数来决定 vector 对象保存元素的
    个数,元素值指定每个元素的初始值】

    vector对象动态增长:

    vector 对象(以及其他标准库容器对象)的重要属性就在于可以在运行时高效地添加元素。

    注意:因为 vector 增长的效率高,在元素值已知的情况下,最好是动态地添加元素。
    
    • 1

    实例:

    vector<int>test;//建立一个vector,int为数组元素的数据类型,test为动态数组名
    
    • 1

    简单的使用方法如下:

    vector<int>test;//建立一个vector
    test.push_back(1);
    test.push_back(2);//把1和2压入vector,这样test[0]就是1,test[1]就是2
    
    • 1
    • 2
    • 3

    实例:

    vector<vector<Point2f> > points; //定义一个二维数组
    points[0].size();  //指第一行的列数
    
    • 1
    • 2

    1 、基本操作

    (1)头文件​#include​.

    (2)创建vector对象,​vector vec​;

    (3)尾部插入数字:​vec.push_back(a)​;

    (4)使用下标访问元素,​cout<记住下标是从0开始的。

    (5)使用迭代器访问元素.

    vector<int>::iterator it;
    for(it=vec.begin();it!=vec.end();it++)
        cout<<*it<<endl;
    
    • 1
    • 2
    • 3

    (6)插入元素:​vec.insert(vec.begin()+i,a)​; 在第i+1个元素前面插入a;

    (7)删除元素:​vec.erase(vec.begin()+2)​ ; 删除第3个元素

    ​vec.erase(vec.begin()+i,vec.end()+j)​; 删除区间[ i,j-1] 区间从0开始

    (8)向量大小: ​vec.size()​;

    (9)清空: ​vec.clear()​;

    特别提示:这里有 begin() 与 end() 函数、front() 与 back() 的差别

    2、重要说明

    vector 的元素不仅仅可以是 int,double,string 还可以是结构体,但是要注意:结构体要定义为全局的,否则会出错。

    #include  
    #include  
    #include  
    #include  
    using namespace std;  
    typedef struct rect  
    {  
        int id;  
        int length;  
        int width;  
      //对于向量元素是结构体的,可在结构体内部定义比较函数,下面按照id,length,width升序排序。  
      bool operator< (const rect &a)  const  
        {  
            if(id!=a.id)  
                return id<a.id;  
            else  
            {  
                if(length!=a.length)  
                    return length<a.length;  
                else  
                    return width<a.width;  
            }  
        }  
    }Rect;  
    int main()  
    {  
        vector<Rect> vec;  
        Rect rect;  
        rect.id=1;  
        rect.length=2;  
        rect.width=3;  
        vec.push_back(rect);  
        vector<Rect>::iterator it=vec.begin();  
        cout<<(*it).id<<' '<<(*it).length<<' '<<(*it).width<<endl;      
    return 0;  
    }  
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36

    3、算法

    (1) 使用reverse将元素翻转:需要头文件 #include

    reverse(vec.begin(),vec.end());将元素翻转,即逆序排列!

    (在vecto r中,如果一个函数中需要两个迭代器,一般后一个都不包含)

    (2)使用 sort 排序:需要头文件 #include,

    sort(vec.begin(),vec.end());(默认是按升序排列,即从小到大).

    可以通过重写排序比较函数按照降序比较,如下:

    定义排序比较函数:

    bool Comp(const int &a,const int &b)
    {
        return a>b;
    }
    
    • 1
    • 2
    • 3
    • 4

    调用时: sort(vec.begin(),vec.end(),Comp),这样就降序排序。

    输出vector的中的元素

    vector<float> vecClass; 
    
    int nSize = vecClass.size();   
    
    • 1
    • 2
    • 3

    //打印 vecClass,方法一:

    for(int i=0;i<nSize;i++)    
    {    
       cout<<vecClass[i]<<"     ";    
    }    
       cout<<endl;   
    
    • 1
    • 2
    • 3
    • 4
    • 5

    需要注意的是:以方法一进行输出时,数组的下表必须保证是整数。

    //打印 vecClass,方法二:

    for(int i=0;i<nSize;i++)    
    {    
       cout<<vecClass.at(i)<<"     ";    
    }    
       cout<<endl;    
    
    • 1
    • 2
    • 3
    • 4
    • 5

    //打印 vecClass,方法三:输出某一指定的数值时不方便

    for(vector<float>::iterator it = vecClass.begin();it!=vecClass.end();it++)    
    {    
        cout<<*it<<"   ";    
    }    
        cout<<endl;    
    
    • 1
    • 2
    • 3
    • 4
    • 5

    二维数组的使用:

    #include "stdafx.h"  
    #include   
    #include    
    #include    
    using namespace std;  
    int main()  
    {  
        using namespace std;  
        int out[3][2] = { 1, 2,   
                 3, 4,  
                5, 6 };  
        vector <int*> v1;  
        v1.push_back(out[0]);  
        v1.push_back(out[1]);  
        v1.push_back(out[2]);  
        cout << v1[0][0] << endl;//1  
        cout << v1[0][1] << endl;//2  
        cout << v1[1][0] << endl;//3  
        cout << v1[1][1] << endl;//4  
        cout << v1[2][0] << endl;//5  
        cout << v1[2][1] << endl;//6  
        return 0;  
    }  
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
  • 相关阅读:
    掘金热榜首推!阿里内部都在用的Java后端面试笔记,囊括99%的主流技术
    淘宝/天猫,1688,拼多多,京东店铺获取所有商品详情(api接口详情)
    uni-app基于vite和vue3创建并集成pinia实现数据持久化
    STM32启动分析之main函数是怎样跑起来的
    Java循环获取对象属性名称、属性值
    预售, 产品开发完成前没人买,那么之后也不会有
    Alexa Fluor 远红色染料|DBCO-AF647|AF-647-DBCO
    300分钟吃透分布式缓存-17讲:如何理解、选择并使用Redis的核心数据类型?
    jar包与war包部署的区别及jar包部署的一个路径访问问题
    Linux:ssh免密登陆
  • 原文地址:https://blog.csdn.net/qq_40713201/article/details/126740586