C++STL标准模板库之容器vector

    技术2025-06-17  14

    网上总结vector原理和用法的文章有很多,我也是在学习中逐渐摸索总结,希望能够和大家共同进步。

    VECTOR简介

    vector是STL标准模板库中的重要容器之一,可以通过设置来存放各种不同类型的数据,在STL中vector的实现方式是类模板,这些模板的参数允许我们指定容器中元素的数据类型,在结构上更加灵活,并且能够避免重复编码。

    VECTOR实现

    在工程中创建一个vector对象,在vector上右键转到定义,可以找到vector对应的实现代码。

    template<class _Ty, class _Alloc = allocator<_Ty> > class vector : public _Vector_alloc<_Vec_base_types<_Ty, _Alloc> > { // varying size array of values public: typedef vector<_Ty, _Alloc> _Myt; ... }

    由于代码非常多,所以在这里只贴一小部分,能够看出,vector实际上是一个模板类,它通过类模板的形式来达到存储不同种数据的实现。也可以将其看做是存放某种数据类型的动态数组。

    VECTOR使用方法

    1.建立容器(构造对象)
    //---无初值--- vector<int> v1; //表示存放int型的容器 vector<double> v1; //表示存放double型的容器 class color{...}; vector<color> vc1; //表示存放类color的容器 //---有初值--- vector<int> v1 = { 1, 2, 3, 4 }; //v1的元素是1、2、3、4 vector<int> v2(5); //v2的元素个数为5,元素值都为0 vector<int> v3(5, 1); //v3的元素个数为5,元素值都为1 vector<int> v4(v1); //拷贝构造,v4=v1 vector<int> v5(v1.begin(), v1.end()); //v5的元素是从v1的首个元素到最后一个元素 vector<int> v6(v1.begin(), v1.begin()+3);//v6的元素是v1的前3个元素 int ary[] = {1,2,3,4,5}; vector<int> v7(ary, ary+3); //v7的元素是数组ary中的前3个元素

    注意:这里的v1.begin()指向数组首个元素,但v1.end()并不是指向最后元素,而是指向最后一个元素的下一个,有点类似于字符串里的 ‘\0’ 。在执行vector<int> v4(v1.begin(), v1.end());的拷贝操作中,拷贝区间是左闭右开的,在之后的类似操作中也都是左闭右开。

    2.容器赋值
    //---assign函数--- vector<int> v1 = {1,2,3,4,5,6}; vector<int> v2; v2.assign({1,2,3,4,5}); //v2被赋值为{1,2,3,4,5} v2.assign(v1.begin(), v1.end()); //v2被赋值为v1的首个元素到最后一个元素 v2.assign(v1.begin(), v1.begin()+3); //v2被赋值为v1的首个元素到第3个元素 vector<int>::iterator iter = v1.begin(); v2.assign(iter, iter+3); //利用迭代器,v2被赋值为v1的首个元素到第3个元素 //---直接赋值--- v2 = v1; //爽!
    3.容器长度的查询、设置和调整
    //---查询长度--- vector<int> v1 = {1,2,3,4,5}; int len = v1.size(); //得到v1的长度,即元素个数 intcaplen = v1.capacity(); //得到v1的容器大小 bool isEmpty = v1.empty(); //查询容器是否为空,是则返回true

    v1.size()表示当前v1内的元素个数,v1.capacity()表示当前容器所能容纳的最大元素个数。当容器建立赋初值且未进行插入删除时,这两个值是相等的,但是进行向v1内添加元素的操作后,caplen就会大于len,这是因为初始化时分配的容器长度5已经不足以添加元素,所以要再开辟一块新的更大的空间(例如长度8)将前5个复制进去,再把第6个元素赋值为想添加的值。此时元素个数为6,但容器个数为8。这样做可以减少操作次数,节省资源。需要注意的是,当v1.capacity() > v1.size()时,不能通过v1[5]类似的方式直接调用或赋值给size()之外的值,多余空间是push_back用的,对于我们来说,只可知不可用。

    //---调整长度--- vector<int> v1 = {1,2,3,4,5}; v1.resize(8); //v1的元素个数改为8个,大于原长度则补默认值0 v1.resize(3); //v1的元素个数改为3个,小于原长度则删除后面2个 v1.resize(8, 88); //v1的元素个数改为8,大于原长度则补设定值88 v1.resize(3, 88); //v1的元素个数改为3,小于原长度则删除后面2个 v1.reserve(15); //v1的元素个数仍为6个,但整体容器长度改为15个

    注:resize()函数改变的容器元素个数,即v1.size();reserve函数改变的是容器大小,即v1.capacity()。

    4.容器数据的增加、删除、查询和改动

    1.数据添加

    //---在末尾添加元素--- vector<int> v1 = {1,2,3,4,5}; v1.push_back(6); //在末尾添加元素,值为6 //---在数据中间插入元素--- vector<int> v2 = {6,7,8,9,10}; v1.insert(v1.begin() + 1, v2.begin(), v2.end());//在v1的第1个元素的前面插入v2 v1.insert(v1.begin() + 1, 5, 66); //在v1的第1个元素的前面插入5个66 v1.insert(v1.begin() + 1, 66); //在v1的第1个元素的前面插入66 v1.insert(v1.begin() + 1, { 6,7,8 }); //在v1的第1个元素的前面插入{6,7,8} //这里本来还应该有一个int && _Val的方式,以后学完C++11的特性再来补充

    2.数据删除

    //---删除末尾元素--- vector<int> v1 = {1,2,3,4,5}; v1.pop_back(); //删除末尾元素5 //---删除中间元素--- v1.erase(v1.begin()+1); //删除第2个元素v1[1] v1.erase(v1.begin()+1, v1.begin()+3); //删除从第2个到第3个元素。注意!左开右闭! //---删除所有元素--- v1.clear(); //爽! //注意,执行clear后,v1.capacity()的值不变!

    3.数据的单独查询和改动

    //---查找容器内是否包含某一元素--- vector<int> v1 = {1,2,3,4,5}; bool isFind = count(v1.begin(), v1.end(), 3);//在v1内查找3是否存在,是则返回1 //---下标操作--- int num1 = v1[3]; v1[3] = 6; //---at函数--- int num2 = v1.at(3); v1.at(3) = 6; //---首位接口--- int num3 = v1.front(); //v1的首元素 int num4 = v1.back(); //v1的末元素 v1.front() = 6; //v1的首元素更改为6 v1.back() = 6; //v1的末元素更改为6

    4.数据的依次查询或改动

    //---通过循环--- vector<int> v1 = {1,2,3,4,5}; for(int i = 0; i < v1.size(); i++) { cout << "第" << i << "个元素的值为:" << v1[i] << endl; //读取 v1[i] = 5; //赋值 } //---通过迭代器--- vector<int>::iterator iter = v1.begin(); for(; iter != v1.end(); iter++) { cout << *iter << endl; //读取 *iter = 5; //赋值 }
    5.容器的其它操作
    //需要头文件#include<algorithm> //---排序--- vector<int> v1 = {2,1,3,4,5}; sort(v1.begin(), v1.end());//对容器v1内的数据进行排序,区间可选 //---反转--- reverse(v1.begin(), v1.end());//对容器v1进行反转,区间可选 //后面如果遇到再补充吧

    其中,sort函数在我的其它文里有介绍,在这里不过多说明。以上就是我总结的内容,以后在学习过程中遇到新的东西会继续更新,希望大家批评指正!

    链接: C++STL标准模板库之容器deque.

    . 我是没信号的法杖,无法发送信号,也无法接受信号。

    Processed: 0.011, SQL: 9