【C++】STL详解(三)—vector使用手册:不看你会后悔
注意:这只是一个示例,注意是任意类型,不止如下的类型代码语言:javascriptAI代码解释//构造int类型的空容器//构造double类型的空容器//构造char类型的空容器//构造string类型的空容器。
- 存储方式: 与数组一样,
vector使用 连续内存空间 存储元素,因此可以通过下标随机访问,时间复杂度为O(1)。 - 动态扩容: 与普通数组不同,
vector的大小可以动态改变。当空间不足时,会分配新的更大内存,把原有元素拷贝过去,再释放旧空间。 - 空间策略:
vector会 预留额外空间 来减少频繁扩容。不同实现的扩容策略不同,但通常是以倍数方式增长,从而保证 均摊插入复杂度为O(1)。 - 性能特点:
- 访问元素效率高(支持随机访问)。
- 在末尾插入/删除效率高。
- 在中间或开头插入/删除效率低(需要移动大量元素)。
👉 一句话总结: 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阶段,迭代器本质上等同于指针。 但在其他容器(如list、map)中,元素存储方式不同,不一定是连续内存,这时迭代器并不是单纯的指针,而是一个 封装了指针行为的类对象,通过运算符重载来模拟“像指针一样使用”。
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位置的元素,或删除所给迭代器区间内的所有元素(左闭右开)。
代码语言:javascript
AI代码解释
#include<iostream>
#include<vector>
using namespace std;
void test04()
{
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); //删除在该迭代器区间内的元素(左闭右开)
return 0;
}
int main()
{
//test01();
//test02();
//test03();
test04();
return 0;
}
运行结果如下:

在这里插入图片描述

在这里插入图片描述
以上是按位置进行插入或删除元素的方式,若要按值进行插入或删除(在某一特定值位置进行插入或删除),则需要用到find函数。 find函数: find函数共三个参数,前两个参数确定一个迭代器区间(左闭右开),第三个参数确定所要寻找的值。 find函数在所给迭代器区间寻找第一个匹配的元素,并返回它的迭代器,若未找到,则返回所给的第二个参数
更多推荐

所有评论(0)