【C++】vector类概述

一、标准库中的vector

文档链接

1.1 vector的介绍

vector可以类比C语言的数组,他就像是一个可以动态增长的数组。
本质讲,vector使用动态分配数组来存储它的元素。当新元素插入时候,这个数组需要被重新分配大小为了增加存储空间。其做法是,分配一个新的数组,然后将全部元素移到这个数组。就时间而言,这是一个相对代价高的任务,因为每当一个新的元素加入到容器的时候,vector并不会每次都重新分配大小,vector会分配一些额外的空间以适应可能的增长,因为存储空间比实际需要的存储空间更大。

1.2 vector的常用接口

1.2.1 vector的常见构造

vector() 无参构造
vector(size_type n, const value_type& val = value_type()) 构造并初始化n个val
vector (const vector& x) 拷贝构造
vector (InputIterator first, InputIterator last) 使用迭代器进行初始化构造

int main()
{
	vector<int> v1;// 无参数构造
	vector<int> v2(5, 1);// 构造并初始化n个val
	vector<int> v3(v1);// 拷贝构造
	vector<int> v4(v1.begin(), v1.end());// 使用迭代器进行初始化构造
	return 0;
}

1.2.2 vector类对象的访问及遍历操作

begin +end 获取第一个数据位置的iterator/const_iterator, 获取最后一个数据的下一个位置的iterator/const_iterator
rbegin + rend 获取最后一个数据位置的reverse_iterator,获取第一个数据前一个位置的
reverse_iterator

operator[] 返回pos位置的数据

int main()
{
	vector<int> v;
	v.push_back(1);
	v.push_back(2);
	v.push_back(3);
	v.push_back(4);
	vector<int>::iterator it = v.begin();// 正向访问
	while (it != v.end())
	{
		cout << *it << " ";
		it++;
	}
	cout << endl;
	vector<int>::reverse_iterator rit = v.rbegin();// 逆向访问
	while (rit != v.rend())
	{
		cout << *rit << " ";
		rit++;
	}
	cout << endl;
	for (int i = 0; i < v.size(); i++)// []访问
	{
		cout << v[i] << " ";
	}
	cout << endl;
	return 0;
}

1.2.3 vector类对象的容量操作

size 获取数据个数
capacity 获取容量大小
empty 判断是否为空
reserve 扩容
resize 扩容+初始化

int main()
{
	vector<int> v;
	v.push_back(1);
	v.push_back(2);
	v.push_back(3);
	v.push_back(4);
	cout << v.size() << endl;// 获取数据个数
	cout << v.capacity() << endl;// 获取容量大小
	cout << v.empty() << endl;// 判断是否为空
	v.reserve(10);// 扩容
	cout << "newsize:" << v.size() << endl;
	cout << "newcapacity:" << v.capacity() << endl;
	v.resize(10);// 扩容 + 初始化
	cout << "newsize:" << v.size() << endl;
	cout << "newcapacity:" << v.capacity() << endl;
	return 0;
}

结果:

4
4
0
newsize:4
newcapacity:10
newsize:10
newcapacity:10

1.2.4 vector类对象的修改操作

push_back 尾插
pop_back 尾删
assign 覆盖
find 查找(注意这个是算法模块实现,不是vector的成员接口)
sort 排序(注意这个是算法模块实现,不是vector的成员接口)
insert 在position之前插入val
erase 删除position位置的数据
swap 交换两个vector的数据空间

除了assign和find其他接口在string类的概述里面讲过,他们都大同小异。
【C++】string类概述

int main()
{
	vector<int> v;
	v.push_back(1);
	v.push_back(2);
	v.push_back(3);
	v.push_back(4);
	v.assign(4, 10);// 覆盖
	for (auto e : v)
	{
		cout << e << " ";
	}
	return 0;
}

在这里插入图片描述
使用find和sort前要先引入库函数:#include <algorithm>

int main()
{
	vector<int> v;
	v.push_back(5);
	v.push_back(4);
	v.push_back(3);
	v.push_back(2);
	v.push_back(7);
	v.push_back(1);
	v.push_back(6);
	vector<int>::iterator it = find(v.begin(), v.end(), 6);// 查找
	cout << *it << endl;
	sort(v.begin(), v.end());// 排序
	for (auto e : v)
	{
		cout << e << " ";
	}
	return 0;
}

在这里插入图片描述

二、迭代器失效问题

首先要知道迭代器的底层是指针,或者是对指针进行了封装,vector的原生态指针就是T*
而迭代器失效就是指针指向的空间被销毁了,如果继续使用,就会造成崩溃。

对于vector可能会导致其迭代器失效的操作有:
引起其底层空间容量改变的操作,都有可能是迭代器失效,比如:resize、reserve、insert、assign、push_back等

例如:

int main()
{
	vector<int> v;
	v.push_back(1);
	v.push_back(2);
	v.push_back(3);
	v.push_back(4);
	v.push_back(5);
	vector<int>::iterator it = v.begin();
	while (it != v.end())
	{
		cout << *it << " ";
		it++;
	}
	v.reserve(10);
	while (it != v.end())
	{
		cout << *it << " ";
		it++;
	}
	return 0;
}

在这里插入图片描述
迭代器失效解决办法:在使用前,对迭代器重新赋值即可。,后面的模拟实现会讲解。



纸上得来终觉浅,绝知此事要躬行。

  • 62
    点赞
  • 48
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 49
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

命由己造~

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

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

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

打赏作者

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

抵扣说明:

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

余额充值