C++之STL中vector的使用

前言

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

一、创建对象

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

1.vector()

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

	vector<int> v1;//创建一个int类型的顺序表v1
	vector<char> v2;//创建一个char类型的顺序表v2
	vector<double> v3;//创建一个double类型的顺序表v3

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

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

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

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

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

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

4.vector (const vector& x);

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

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

二、迭代器

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

三、空间问题

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

1.size()

获取数据个数

	vector<int> v1(10, 1);
	v1.size();//获取元素的个数为10

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

改变vectoe的size
如果n>size(),就会将vector的size扩大到n,扩大后新插入的元素为val
如果n<size(),会将vector的size缩小到n,并且val失效

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

3.capacity()

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

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

4.empty()

判断vector是否为空

	vector<int> v1(1, 1);
	if (v1.empty())
		cout << "容器为空";
	else
		cout << "容器不为空";

5.void reserve (size_type n);

改变vector的capacity

	vector<int> v1(2, 1);
	cout << v1.capacity()<< ' ';//输出2
	v1.reserve(10);
	cout << v1.capacity()<< ' ';//输出10
	cout << v1.size() << ' ';   //输出2
	//注意:改变capacity并不会改变size

四、vector增删查改

1.void push_back (const value_type& val);

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

	vector<int> v1;
	v1.push_back(1);
	v1.push_back(2);
	v1.push_back(3);
	v1.push_back(4);
	//最后容器中的数据为1,2,3,4

2.void pop_back();

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

	vector<int> 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

3.find

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

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

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<int> 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<int>::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

5.erase

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

	vector<int> 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

6.operator[]

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

	vector<int> 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

总结

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

  • 20
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 22
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 22
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

熬夜学C++

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值