首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >【C++】STL(一)vetor的使用

【C++】STL(一)vetor的使用

作者头像
IFMaxue
发布2025-05-25 09:45:52
发布2025-05-25 09:45:52
2480
举报
文章被收录于专栏:学习学习

vector的介绍

  1. vector是可变大小数组的容器
  2. vector采用连续空间存储的方式,同时也表示可以采用下标访问
  3. vector的大小可以动态改变
  4. vector的重新分配大小策略:开辟一个新的数组,将原数组的数据移到新数组,并且释放原数组的空间
  5. vector分配空间策略:vector会分配一些额外的空间以适应可能的增长因此存储空间比实际需要的存储空间更大
  6. vector的尾插和尾删的效率较高。但是非尾部元素的插入和删除效率较低

vector的使用:

vecotr的定义方式 方式一:构造一个某类型的空容器

代码语言:javascript
复制
vector<int> v1//构造ing类型的空容器

方式二:构造一个含有n个val的某类型容器

代码语言:javascript
复制
vector<int> v2(10,2)//构造含有10连续为元素2的int类型的容器

方式三:拷贝构造某类型容器

代码语言:javascript
复制
vector<int> v3(v2);

方式四:使用迭代器拷贝构造某一段内容

代码语言:javascript
复制
vector<int>v4(v2.begin(),v2.end())

注意:该方式也用于拷贝其他容器的某一段内容

代码语言:javascript
复制
string s("hello world");
vector<char> v5(s.begin(), s.end());
元素访问

【】访问

代码语言:javascript
复制
#include <iostream>
#include <vector>
using namespace std;

int main()
{
	vector<int> v(10, 1);
	//使用“下标+[]”的方式遍历容器
	for (size_t i = 0; i < v.size(); i++)
	{
		cout << v[i] << " ";
	}
	cout << endl;
	return 0;
}

迭代器访问:

代码语言:javascript
复制
#include <iostream>
#include <vector>
using namespace std;

int main()
{
	vector<int> v(10, 1);
	//范围for
	for (auto e : v)
	{
		cout << e << " ";
	}
	cout << endl;
	return 0;

vector的空间增长问题size和capacity

  1. 通过size函数获取当前容器的有效个数元素
  2. 通过capacity函数获取当前容器的最大容量。
代码语言:javascript
复制
int main()
{
vector<int> v2(10,2);
cout << v.size() << endl; //获取当前容器中的有效元素个数
cout << v.capacity() << endl; //获取当前容器的最大容量
}

**#### reserve和resize

  1. 通过reserse函数改变容器的最大容量
  2. resize函数改变容器中的有效元素个数。**

reserve规则:  1、当所给值大于容器当前的capacity时,将capacity扩大到该值。  2、当所给值小于容器当前的capacity时,什么也不做。

resize规则:  1、当所给值大于容器当前的size时,将size扩大到该值,扩大的元素为第二个所给值,若未给出,则默认为0。  2、当所给值小于容器当前的size时,将size缩小到该值。

代码语言:javascript
复制
int main()
{
	vector<int> v(10, 2);
	cout << v.size() << endl; //10
	cout << v.capacity() << endl; //10
	v.reserve(20); //改变容器的capacity为20,size不变 
	cout << v.size() << endl; //10
	cout << v.capacity() << endl; //20
	v.resize(15); //改变容器的size为15
	cout << v.size() << endl; //15
	cout << v.capacity() << endl; //20
	return 0;
}
empty

通过empty函数判断当前容器是否为空。

代码语言:javascript
复制
int main() { 
vector<int> v(10, 2); 
cout << v.empty() << endl; return 0; 
}

vector的使用 ![[Pasted image 20250519085900.png]] 正向迭代器:

vector的增删查改
push_back和pop_back

通过push_back函数对容器进行尾插,pop_back函数对容器进行尾删。

代码语言:javascript
复制
#include <iostream>
#include <vector>
using namespace std;

int main()
{
	vector<int> v;
	v.push_back(1); //尾插元素1
	v.push_back(2); //尾插元素2
	v.push_back(3); //尾插元素3
	v.push_back(4); //尾插元素4

	v.pop_back(); //尾删元素
	v.pop_back(); //尾删元素
	v.pop_back(); //尾删元素
	v.pop_back(); //尾删元素
	return 0;
}
insert和erase

通过insert函数可以在所给迭代器位置插入一个或多个元素,通过erase函数可以删除所给迭代器位置的元素,或删除所给迭代器区间内的所有元素(左闭右开)。

代码语言:javascript
复制
	vector<int> v;
	v.push_back(1);
	v.push_back(2);
	v.push_back(3);
	v.push_back(4);
	v.insert(v.begin(), 0); //在容器开头插入0
	
	v.insert(v.begin(), 5, -1); //在容器开头插入5个-1

	v.erase(v.begin()); //删除容器中的第一个元素

	v.erase(v.begin(), v.begin() + 5); //删除在该迭代器区间内的元素(左闭右开)

vector迭代器失效问题

迭代器的主要作用是是让我们在使用各个容器时不用关心底层的数据节后。在数组中就想到于指针。而且迭代器失效相当于迭代器底层对应的指针指向了一块被释放的空间,继续运行会导致崩溃 示例一(失效):

代码语言:javascript
复制
vector<int> v;
	v.push_back(1);
	v.push_back(2);
	v.push_back(3);
	v.push_back(4);
	v.push_back(5);
	//v: 1 2 3 4 5
	vector<int>::iterator pos = find(v.begin(), v.end(), 2); //获取值为2的元素的迭代器
	v.insert(pos, 10); //在值为2的元素的位置插入10
	//v: 1 10 2 3 4 5
	v.erase(pos); //删除元素2???error(迭代器失效)
	//v: 1 2 3 4 5
	return 0;

在该代码中,我们本意是使用元素2的迭代器在原序列中2的位置插入一个10,然后将2删除,但我们实际上获取的是指向2的指针,当我们在2的位置插入10后,该指针就指向了10,所以我们之后删除的实际上是10,而不是2。

代码语言:javascript
复制
int main()
{
	vector<int> v;
	for (size_t i = 1; i <= 6; i++)
	{
		v.push_back(i);
	}
	vector<int>::iterator it = v.begin();
	while (it != v.end())
	{
		if (*it % 2 == 0) //删除容器当中的全部偶数
		{
			v.erase(it);
		}
		it++;
	}
	return 0;

这里大眼一看觉得没什么问题,但是我们仔细思考:你会发现++和erase导致的–时同时进行的,那么两个指针式绝对会错过的,会造成程序崩溃

迭代器失效解决方法

使用迭代器时,永远记住一句话:每次使用前,对迭代器进行重新赋值。

实例一解决方法:

代码语言:javascript
复制
	vector<int> v;
	v.push_back(1);
	v.push_back(2);
	v.push_back(3);
	v.push_back(4);
	v.push_back(5);
	//v: 1 2 3 4 5
	vector<int>::iterator pos = find(v.begin(), v.end(), 2); //获取值为2的元素的迭代器
	v.insert(pos, 10); //在值为2的元素的位置插入10
	//v: 1 10 2 3 4 5
	pos = find(v.begin(), v.end(), 2); //重新获取值为2的元素的迭代器
	v.erase(pos); //删除元素2

实例2解决办法

代码语言:javascript
复制
#include <iostream>
#include <vector>
using namespace std;

int main()
{
	vector<int> v;
	for (size_t i = 1; i <= 6; i++)
	{
		v.push_back(i);
	}
	vector<int>::iterator it = v.begin();
	while (it != v.end())
	{
		if (*it % 2 == 0) //删除容器当中的全部偶数
		{
			it = v.erase(it); //删除后获取下一个元素的迭代器
		}
		else
		{
			it++; //是奇数则it++
		}
	}
	return 0;
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2025-05-25,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • vector的介绍
  • vector的使用:
    • vector的增删查改
  • vector迭代器失效问题
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档