<CPP>STL——vector应用总结

vector是可以储存任意类型的动态顺序表
在这里插入图片描述

构造与销毁

vector构造时指定容器中的数据类型

构造的方式

  • 空构造
  • n个值位value的构造
  • 区间构造
  • 拷贝构造
	//空构造
	vector<int> v1;
	//构造十个5
	vector<int> v2(10, 5);
	//范围构造
	vector<int> v3{ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
	//拷贝构造
	vector<int> v4(v2);

在这里插入图片描述
除了容器中的元素外,容器中还包含

  • size:容器中数据的个数
  • capacity:容器的总容量

容量操作

函数功能
size()获取数据个数
capacity()获取容量大小
empty()判断当前是否为空
resize(n,data)改变size
reserve(n,data)改变capacity

元素访问

函数功能
operator[]下标访问
font()返回容器中首个元素
back()返回容器末尾元素

元素修改操作

函数功能
push_back()尾部插入一个元素
pop_back()删除尾部一个元素
insert(pos,val)在pos位置插入值为val的元素
erase(pos)删除pos位置的元素
swap()交换两个vector中的空间
	vector<int> v{0,1,2,3,5};
	//尾插,尾删
	v.push_back(6);
	v.pop_back();

	//找到值为5的位置,并在位置前插入4
	vector<int>::iterator pos = find(v.begin(), v.end(), 5);
	v.insert(pos, 4);

	//删除pos位置的元素
	v.erase(pos);

	//将两个元素的空间调换
	vector<int> v2{ 6, 7, 8, 9 };
	v.swap(v2);

自动扩容机制

在这里插入图片描述
以此为例,当有效元素都以及填满了vector的容量,此时使用push_back向后添加一个元素时,容器会在尾插前,先将容量扩充
在这里插入图片描述
vector自动扩充,会先创建一个大的新空间,将原来容器中的内容拷贝到新空间中,最后将vector的指向从旧空间改到新空间。一般扩容按照1.5倍增长
如果使用循环push_back的话,自动扩容会导致效率降低,所以一般情况先用reserve将容器扩容到合适大小,再进行循环尾插

迭代器

迭代器:类似指针的一种类型,可以将迭代器定义的对象当成指针的方式应用
作用:帮助用户透明(用户可以不用知道该容器的迪岑和数据结构)地遍历容器中的元素

函数功能
begin()获取第一个元素的位置
end()获取最后一个元素的下一个位置
//通过迭代器遍历容器中元素
	vector<int> v{ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
	vector<int>::iterator it = v.begin();
	while (it != v.end())
	{
		cout << *it << endl;
		it++;
	}

迭代器失效

迭代器失效的场景
迭代器失效是由于在迭代器获取初始位置后,容器发生了内存扩容,旧空间被销毁了,导致一开始迭代器的指向了无效地址,导致出错,迭代器失效,也是指针失效
在这里插入图片描述

  • pushi_back()自动扩容
  • resize(),reserve(),insert()

解决迭代器失效
重新声明迭代器,push_back可能会导致迭代器失效,所以什么迭代器一般放在push_back后面的位置

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值