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后面的位置

发布了52 篇原创文章 · 获赞 13 · 访问量 5432

猜你喜欢

转载自blog.csdn.net/MPF1230/article/details/104159973