C++vector(详解)

1.vector的使用

1.1vector的定义

构造函数声明接口说明
vector()无参构造

vector(size_type n,const type_val & val=type_type())

构造并初始化val
vector(const vector& x)(重点)拷贝构造
vector(inputlterator begin,inputlterator end)使用迭代器进行初始化构造

1.2vector iterator 的使用

iterator的使用接口说明
begin获取第一个位置
end获取最后一个位置的下一个
rbegin获取最后一个位置
rend获取第一个位置的前一个

1.3vector的空间增长问题

容量空间接口说明
size获取数据的个数
capacity获取空间的大小
empty判断是否为空
resize改变vector的size
reserve改变vector的capacity

当我们不去控制vector对象的空间时,一直想其中添加数据那么vector是怎么增长的呢??

看下面代码

using namespace std;
#include<iostream>
#include<vector>
int main()
{
	vector<int> v1;
	int size = 0;
	for (int i = 0; i < 100; i++)
	{
		v1.push_back(i);
		size++;
		if (size==v1.capacity())
		{
			cout << v1.capacity() << endl;
		}
	}
}

 在vs的环境下我们可以看出vector类型的对象,空间增长是按1.5倍来增长的

那我们再来看在linux环境下vector是如何增长的呢

我们可以看到,在linux的环境下vector对象增加个数是按2倍进行增长的 

1.4vector的增删查改问题 

vector的增删查改接口说明
push_back尾插
pop_back尾删
find查找
insert在position前插入val
erase删除position的数据
swap交换两个vector的数据空间
operator[]想数组一样访问

 

 1.5vector的迭代器失效问题

迭代器的作用就是让算法不用关心底层数据结构,其底层就是一个指针,或者是对指针进行封装,比如:vector的迭代器就是原生指针T*,因此迭代器失效就是迭代器对应的底层指针指向的那块空间被销毁了,使用了被释放的空间,因此程序会报错。

1.5.1扩容引起的迭代器失效

会引起空间的改变一般都有可能会引起迭代器失效,比如resize,resign,insert,push_back,reserve。

需要扩容时,编译器可能会新开辟一段空间,那么原来的那段空间就失效了,被释放了,但是那个迭代器依然还指向那段空间,所以在访问那段空间时编译器就会崩溃。比如

using namespace std;
#include<iostream>
#include<vector>
int main()
{
	vector<int> v1 = { 1,5,7,4,3,2 };
    auto it = (v1.begin()+3);
	v1.assign(100, 9);
	cout << *it;
}

 1.5.2删除数据引起的迭代器失效

当我们删除一个数据时,编译器会将这个被删除的数据位置后面的数据往前面移动一格

那么迭代器就有可能指向末尾的数据。那么访问时会报错,就算迭代器没有指向末尾的数据,在vs的环境下,会进行强制检查,意思就是当删除这个数据时,再次访问这个位置或是访问后面的位置时,即使没有指向末尾的数据,编译器仍然会报错

虽然不能访问后面的数据但前面的数据依然可以访问 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值