• C++之STL中vector的使用


    前言

    前面我们已经向大家介绍过了C++STL库,今天我就来向大家介绍一下其中vector的使用方法,一起来看看吧。
    vector底层其实是用一个顺序表来实现的,只不过为了支持泛型编程所以被弄成了模板,这样使用就会更加的便利。

    一、创建对象

    在我所用的C++文档中给出了四种的使用方法,这里我们会一一介绍

    1.vector()

    直接创建vector对象,与构造函数的形式一样

    	vector v1;//创建一个int类型的顺序表v1
    	vector v2;//创建一个char类型的顺序表v2
    	vector v3;//创建一个double类型的顺序表v3
    
    • 1
    • 2
    • 3

    2.vector (size_type n, const value_type& val)

    创建一个对象,创建完后其中会有n个val元素
    这里的size_type 其实可以理解为我们经常使用的size_t,value_type就是我们所创建顺序表其中所包含的元素的类型。

    	vector v1(5,1);//创建一个int类型的顺序表v1,其中有5个1
    	vector v2(5,'a');//创建一个char类型的顺序表v2,其中有5个'a'
    	vector v3(2,2.2);//创建一个double类型的顺序表v3,其中有2个2.2
    
    • 1
    • 2
    • 3

    3.template < class InputIterator > (模板) vector (InputIterator first, InputIterator last)

    利用迭代器区间的形式创建对象
    template < class InputIterator >是定义出来的一个模板,其中 InputIterator则为模板参数,他的底层其实就是一个指针,在C++中我们也经常将其称为迭代器

    	vector v1(10, 5);//创建一个int类型的顺序表v1,其中有10个5
    	vector v2(v1.begin(), v1.end());//按照v1的头至v1的尾元素创建v2,其中有10个5
    	vector v3(v1.begin(), v1.begin() + 5);//按照v1的[0,5]区间创建v3,其中有5个5
    
    • 1
    • 2
    • 3

    4.vector (const vector& x);

    通过已经存在的vector对象创建一个新对象(拷贝构造函数)

    	vector v1(5, 1);//创建一个int类型的顺序表v1,其中有5个1
    	vector v2(v1);  //利用v1创建一个与v1内容一样的v2
    
    • 1
    • 2

    二、迭代器

    迭代器的主要作用就是让算法能够不关心底层数据结构,其底层实际就是一个指针,或者是对指针进行了封装。
    vector的迭代器就是原生态指针T*。(以下的所说的位置指的都是地址)
    1.普通迭代器接口:begin() + end(),其中begin()作用为获取首元素的位置,end()的作用为获取末尾元素的下一个位置
    2.反向迭代器接口:rebegin() + rend(),其中rebegin()的作用为获取末尾元素的下一个位置,rend()的作用为获取首元素的位置
    这两组迭代器恰好相反。

    三、空间问题

    在关于空间操作的这方面,C++提供了五个函数

    1.size()

    获取数据个数

    	vector v1(10, 1);
    	v1.size();//获取元素的个数为10
    
    • 1
    • 2

    2.void resize (size_type n, value_type val = value_type());

    改变vectoe的size
    如果n>size(),就会将vector的size扩大到n,扩大后新插入的元素为val
    如果n

    	vector v1(2, 1);//其中有2个1
    	v1.resize(5, 3);//size扩大到5,数据:1 1 3 3 3
    	v1.resize(1);//size缩小到1,数据:1
    
    • 1
    • 2
    • 3

    3.capacity()

    获取vector的容量
    注意:这里的容量与size()所指的并不相同,capacity获取的为当前vector最大能容纳的元素个数(数据满后可扩容),size()获取的为当前vector中已有的元素个数

    	vector v1(5,1);
    	cout << v1.capacity();//获取容量
    
    • 1
    • 2

    4.empty()

    判断vector是否为空

    	vector v1(1, 1);
    	if (v1.empty())
    		cout << "容器为空";
    	else
    		cout << "容器不为空";
    
    • 1
    • 2
    • 3
    • 4
    • 5

    5.void reserve (size_type n);

    改变vector的capacity

    	vector v1(2, 1);
    	cout << v1.capacity()<< ' ';//输出2
    	v1.reserve(10);
    	cout << v1.capacity()<< ' ';//输出10
    	cout << v1.size() << ' ';   //输出2
    	//注意:改变capacity并不会改变size
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    四、vector增删查改

    1.void push_back (const value_type& val);

    尾插,直接在容器的最后面插入数据

    	vector v1;
    	v1.push_back(1);
    	v1.push_back(2);
    	v1.push_back(3);
    	v1.push_back(4);
    	//最后容器中的数据为1,2,3,4
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    2.void pop_back();

    尾删,直接删除容器的最后一个元素

    	vector v1;
    	v1.push_back(1);
    	v1.push_back(2);
    	v1.push_back(3);
    	v1.push_back(4);
    	v1.pop_back();//删除4
    	v1.pop_back();//删除3
    	//最后容器中的数据为1,2
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    3.find

    template (模板)
    InputIterator find (InputIterator first, InputIterator last, const T& val);
    这里的InputIterator就是我们前面所说的迭代器
    查找,但是需要注意的是:这个是算法模块实现的,不是vector的成员接口,所以在使用的时候需要包algorithm头文件

    	vector v1;
    	v1.push_back(1);
    	v1.push_back(2);
    	v1.push_back(3);
    	v1.push_back(4);
    	vector::iterator it = find(v1.begin(), v1.end(), 3);
    	//it中即为元素3所在的位置
    	//若是没有找到需要找的元素,则返回最后一个元素的下一个位置,即end()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    4.insert

    1.iterator insert (iterator position, const value_type& val);
    2.void insert (iterator position, size_type n, const value_type& val);
    3.template
    void insert (iterator position, InputIterator first, InputIterator last);
    上面有三种用法:
    1.在position位置直接插入一个元素,position是一个迭代器
    2.在position位置直接插入n个元素,position是一个迭代器
    3.在position位置插入一段区间(区间用迭代器表示),position是一个迭代器

    	vector v1;
    	v1.push_back(1);
    	v1.push_back(2);
    	v1.push_back(3);
    	v1.push_back(4);
    	//用法一:
    	v1.insert(v1.begin(), 0);//头插入0
    	//0,1,2,3,4
    	//用法二:
    	vector::iterator it = find(v1.begin(), v1.end(), 3);
    	v1.insert(it, 2, 40);//在it位置插入两个40
    	//0,1,2,40,40,3,4
    	//用法三:
    	v1.insert(v1.begin() + 4, v1.begin(), v1.begin() + 2);
    	//v1.begin()位置数据的下标其实和顺序表一样,可以认为是0,
    	//所以第四个位置就是第二个40的位置
    	//在第四个位置插入区间[0,2)的数据,注意区间是左闭右开的,即0,1,
    	//最后结果为0,1,2,40,0,1,40,3,4
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    5.erase

    1.iterator erase (iterator position);
    2.iterator erase (iterator first, iterator last);
    以上有两种用法:
    1.删除position位置的元素
    2.删除first~last区间的所有元素

    	vector v1;
    	v1.push_back(1);
    	v1.push_back(2);
    	v1.push_back(3);
    	v1.push_back(4);
    	v1.push_back(5);
    	v1.push_back(6);
    	//用法一:
    	v1.erase(v1.begin());//头删
    	//2,3,4,5,6
    	
    	//用法二:
    	v1.erase(v1.begin() + 2, v1.begin() + 4);
    	//大家无论是在插入还是删除元素的时候都要注意:
    	//我们最后得出的区间都是左闭右开的,即右边的元素是取不到的
    	// 而且总区间的起始下标为0,所有数据在的区间为[0,5)
    	// 所以这里删除的是[2,4)区间的元素,即4,5 
    	//2,3,6
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    6.operator[]

    reference operator[] (size_type n);
    这里的reference其实指的就是传引用返回,所以我们返回的数据支持修改,n指的就是元素的下标(与数组下标相同)
    有了这个运算符重载,就可以让我们以访问数组的形式去访问vector内的数据

    	vector v1;
    	v1.push_back(1);
    	v1.push_back(2);
    	v1.push_back(3);
    	v1.push_back(4);
    	v1.push_back(5);
    	v1.push_back(6);
    	for (size_t i = 0; i < v1.size(); i++)
    		cout << v1[i] << " ";
    	//输出1 2 3 4 5 6
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    总结

    到这里我们对于vector的一些最常用的函数如何使用就已经讲述完毕了,大家下去可以自己尝试写一下代码,可以加深自己对这些函数的理解,使用次数多了也就可以记住了,另外其实vector的函数操作还有很多,大家可以根据自己的需求去C++官方STL网站中查询使用方法。
    我个人使用的网站是这个https://cplusplus.com/,另外在下一节中我们会模拟实现vector,好奇的盆友可以来看看呀。
    今天的内容到这里就结束了,如果对你有帮助记得给波三连呦!!!

  • 相关阅读:
    深度学习应用篇-计算机视觉-图像分类[3]:ResNeXt、Res2Net、Swin Transformer、Vision Transformer等模型结构、实现、模型特点详细介绍
    【Unity】3D贪吃蛇游戏制作/WebGL本地测试及项目部署
    【实战】硅基物语.AI写作高手:从零开始用ChatGPT学会写作
    libusb系列-002-Windows下libusb源码编译
    【微信小程序】粤语教学平台-粤言粤语
    数据结构 每日一练 :选择 + 编程
    Spring MVC如何使用@Autowired及@Service进行依赖注入呢?
    【7-1 CEmployee类的友元函数改名】 武汉理工大学
    (个人杂记)第九章 串口实验2
    kotlin-筑基(1)
  • 原文地址:https://blog.csdn.net/be_a_struggler/article/details/127611801