1. 存储方式: 与数组一样,vector 使用 连续内存空间 存储元素,因此可以通过下标随机访问,时间复杂度为 O(1)
  2. 动态扩容: 与普通数组不同,vector 的大小可以动态改变。当空间不足时,会分配新的更大内存,把原有元素拷贝过去,再释放旧空间。
  3. 空间策略:vector预留额外空间 来减少频繁扩容。不同实现的扩容策略不同,但通常是以倍数方式增长,从而保证 均摊插入复杂度为 O(1)
  4. 性能特点:
    • 访问元素效率高(支持随机访问)。
    • 在末尾插入/删除效率高。
    • 在中间或开头插入/删除效率低(需要移动大量元素)。

👉 一句话总结: vector 是 C++ 中最常用的容器,本质是一个能自动扩容的动态数组,既有数组的高效访问,又比数组更灵活。

二、vector的使用

1.vector的定义方式

构造一个空的 vector(任意类型)

注意:这只是一个示例,注意是任意类型,不止如下的类型

代码语言:javascript

AI代码解释

vector<int> v1; //构造int类型的空容器
vector<double> v2; //构造double类型的空容器
vector<char> v3; //构造char类型的空容器
vector<string> v4; //构造string类型的空容器

构造一个含有 n 个元素的 vector,每个元素的值都是 val

vector<类型> v1(n个元素,值val);

代码语言:javascript

AI代码解释

vector<int> v1(10,2);
vector<double> v2(10,0.0);
vector<char> v3(10,'d');

拷贝构造函数,用已有的 vector 构造新的 vector

代码语言:javascript

AI代码解释

vector<int> v1(v2); //拷贝构造int类型的v2容器的复制品

用区间 [first, last) 中的元素构造 vector

代码语言:javascript

AI代码解释

vector<int> v2(v1.begin(), v1.end()); //使用迭代器拷贝构造v2容器的某一段内容

在这里插入图片描述

在这里插入图片描述


2.迭代器的使用

vector 中,迭代器的底层实现通常就是一个普通指针,因为 vector 的元素存储在连续的内存空间里,用指针就能完成迭代器的所有功能。因此在 vector 阶段,迭代器本质上等同于指针。 但在其他容器(如 listmap)中,元素存储方式不同,不一定是连续内存,这时迭代器并不是单纯的指针,而是一个 封装了指针行为的类对象,通过运算符重载来模拟“像指针一样使用”。


begin和end

begin函数可以得到容器中第一个元素的正向迭代器,通过end函数可以得到容器中最后一个元素的下一个位置的正向迭代器。

在这里插入图片描述

在这里插入图片描述

代码语言:javascript

AI代码解释

int main()
{
	vector<int> v(6, 6);
	vector<int>::iterator it = v.begin();
	while (it != v.end())
	{
		cout << *it << " " ;
		++it;
	}
	cout << endl;
	return 0;
}

此处仅展示普通vector对象的迭代器使用,因为容器的迭代器的使用都是相通的

在这里插入图片描述

在这里插入图片描述


rbegin和rend

rbegin函数可以得到容器中最后一个元素的反向迭代器,通过rend函数可以得到容器中第一个元素的前一个位置的反向迭代器

在这里插入图片描述

在这里插入图片描述

代码语言:javascript

AI代码解释

int main()
{
	vector<int> v1;
	v1.push_back(5);
	v1.push_back(2);
	v1.push_back(0);
	vector<int>::reverse_iterator rit = v1.rbegin();
	while (rit != v1.rend())
	{
		cout << *rit << " ";
		++rit;
	}
	return 0;
}

运行结果如下:

在这里插入图片描述

在这里插入图片描述


3.空间的增长问题
size和capacity

通过size函数获取当前容器中的有效元素个数,通过capacity函数获取当前容器的最大容量。

代码语言:javascript

AI代码解释

#include<iostream>
#include<vector>
using namespace std;


void test01()
{
	vector<int> v1(6, 6);
	cout << "size:" << v1.size() << endl;//获取当前容器有效数据个数
	cout << "capacity:" << v1.capacity() << endl;//获取当前容器最大容量
}

int main()
{
	test01();

	return 0;
}

运行结果如下:

在这里插入图片描述

在这里插入图片描述


reserve和reszie

函数

作用

规则

reserve

改变容器的 容量 (capacity)

1. 当所给值 > 当前 capacity 时,扩容到该值。2. 当所给值 ≤ 当前 capacity 时,不做任何操作。

resize

改变容器的 有效元素个数 (size)

1. 当所给值 > 当前 size 时,扩展 size 到该值,新增元素为指定值(默认 0)。2. 当所给值 < 当前 size 时,缩小 size 到该值,超出部分元素被移除。

代码语言:javascript

AI代码解释

#include<iostream>
#include<vector>
using namespace std;


void test01()
{
	vector<int> v1(6, 6);
	cout << "size: " << v1.size() << endl;//获取当前容器有效数据个数 6
	cout << "capacity: " << v1.capacity() << endl;//获取当前容器最大容量 6
	v1.reserve(20);//修改容器最大容量为20
	cout << "size: " << v1.size() << endl;//6
	cout << "capacity: " << v1.capacity() << endl;//20
	v1.resize(10);
	cout << "size: " << v1.size() << endl;//10,剩余空间默认为0
	cout << "capacity: " << v1.capacity() << endl;//10
	v1.resize(15,8);
	cout << "size: " << v1.size() << endl;//15,剩余空间补8
	cout << "capacity: " << v1.capacity() << endl;//15
}

int main()
{
	test01();

	return 0;
}

运行结果如下:

在这里插入图片描述

在这里插入图片描述


empty

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

代码语言:javascript

AI代码解释

#include<iostream>
#include<vector>
using namespace std;

void test02()
{
	vector<int> v2(6, 6);
	vector<int> v3;
	cout << "v2: " << v2.empty() << endl;
	cout << "v3: " << v3.empty() << endl;
}
int main()
{
	test02();
	return 0;
}

运行结果如下:

在这里插入图片描述

在这里插入图片描述


4.vector增删查改
push_back和pop_back

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

代码语言:javascript

AI代码解释

#include<iostream>
#include<vector>
using namespace std;

void test03()
{
	vector<int> v1;
	v1.push_back(5);
	v1.push_back(2);
	v1.push_back(0);
	v1.push_back(1);
	v1.push_back(3);
	v1.push_back(1);
	v1.push_back(4);
	
	v1.pop_back();
	v1.pop_back();

}
int main()
{
	//test01();
	//test02();
	test03();
	return 0;
}

代码运行如下:

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述


insert和erase

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

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐