《C++初阶之STL》【vector容器:详解 + 实现】
- 成员函数:提供了vector容器的各类操作接口,涵盖元素访问、添加、删除、修改、容量管理等功能
- 非成员函数重载:通过重载与vector相关的运算符和函数,实现vector与其他数据类型或容器之间的交互,以及对vector进行便捷的通用操作
- 模板特化:针对特定类型对vector模板进行定制化处理,优化性能或满足特殊需求

在这里插入图片描述
1. 常见构造

在这里插入图片描述
|
构造函数声明 |
接口说明 |
|---|---|
|
vector(size_type n, const value_type& val = value_type())填充构造函数std::vector<int> v2(5, 10); std::vector<std::string> v3(3); |
构造并初始化 n 个值为 val 的元素,创建一个包含 n 个指定值元素的 vector 对象。如果未指定 val,元素将使用默认构造函数初始化 |
|
vector(const vector& x)拷贝构造函数std::vector<int> v4(v2); std::vector<int> v5 = v2; |
通过复制另一个 vector 对象 x 来创建新的 vector 对象,新对象与原对象内容完全相同 |
|
vector(InputIterator first, InputIterator last)迭代器范围构造函数int arr[] = {1,2,3}; std::vector<int> v6(arr, arr+3); |
使用迭代器进行初始化构造,利用给定迭代器范围 [first, last) 内的元素来初始化 vector 对象 |
代码语言:javascript
AI代码解释
#include <iostream>
#include <vector>
using namespace std;
int main()
{
// 1. 默认构造函数
vector<int> first;
/* 说明:
* 1. 创建一个空的int类型vector容器
* 2. 此时容器中没有任何元素,size为0,capacity可能为0
*/
// 2. 填充构造函数
vector<int> second(4, 100);
/* 说明:
* 1. 创建一个包含4个元素的vector,每个元素初始值为100
* 2. 构造后容器size为4,所有元素都是100
*/
// 3. 迭代器范围构造函数
vector<int> third(second.begin(), second.end());
/* 说明:
* 1. 通过另一个容器的迭代器范围来构造
* 2. 这里使用second容器的begin()和end()迭代器,构造一个与second元素相同的vector
* 3. 本质是将second中的所有元素逐个拷贝到third中
*/
// 4. 拷贝构造函数
vector<int> fourth(third);
/* 说明:
* 1. 通过拷贝另一个vector来构造
* 2. 这里直接拷贝third容器,构造出一个完全相同的新容器fourth
*/
// 5. 数组构造:
int myints[] = { 16, 2, 77, 29 };
vector<int> fifth(myints, myints + sizeof(myints) / sizeof(int));
/* 说明:通过数组的指针范围来构造vector
* 1. 先定义一个int数组
* 2. 计算数组元素个数:总字节数 / 单个元素字节数
* 3. 然后使用数组的起始地址和结束地址(myints + 4)来构造fifth
*/
// 使用迭代器遍历fifth容器并输出fifth容器中的内容
cout << "fifth容器中的内容:";
//1)vector<int>::iterator是vector<int>的迭代器类型,用于访问容器元素
//2)begin()返回指向第一个元素的迭代器,end()返回指向最后一个元素后一位的迭代器
for (vector<int>::iterator it = fifth.begin(); it != fifth.end(); ++it)
{
//3)*it获取迭代器指向的元素值
cout << ' ' << *it;
}
cout << '\n';
return 0;
}

在这里插入图片描述
2. 容量操作

在这里插入图片描述
|
容量空间相关接口 |
接口说明 |
|---|---|
|
size |
用于获取 vector 中实际存储的数据个数 |
|
capacity |
用于获取 vector 当前已分配的容量大小即:能够容纳元素的最大数量 |
|
empty |
用于判断 vector 是否为空若其中没有存储任何元素则返回 true,否则返回 false |
|
resize |
用于改变 vector 的大小(即:有效元素个数),可以增加或减少元素数量当增加元素时,可指定新元素的默认值当减少元素时,多余元素会被截断 |
|
reserve |
用于改变 vector 的容量即:提前分配一定数量的存储空间,以避免在后续插入元素时频繁进行内存重新分配和数据拷贝操作 |
std::vector::size

在这里插入图片描述
代码语言:javascript
AI代码解释
// vector::size
#include <iostream>
#include <vector>
using namespace std;
int main()
{
//1. 创建一个空的 vector<int> 容器,用于存储 int 类型的数据
vector<int> myints;
cout << "0. size: " << myints.size() << '\n';
//2. 循环 10 次,每次向 myints 的末尾添加一个元素
for (int i = 0; i < 10; i++)
{
myints.push_back(i);
}
cout << "1. size: " << myints.size() << '\n';
//3. insert 成员函数用于在指定位置插入元素
myints.insert(myints.end(), 10, 100); //注意:这里是在 myints 的末尾(myints.end() 指向的位置)插入 10 个值为 100 的元素
cout << "2. size: " << myints.size() << '\n';
//4. pop_back 成员函数用于移除 vector 末尾的一个元素
myints.pop_back();
cout << "3. size: " << myints.size() << '\n';
return 0;
}

在这里插入图片描述
std::vector::capacity

在这里插入图片描述
代码语言:javascript
AI代码解释
#include <iostream>
#include <vector>
using namespace std;
int main()
{
//1.创建一个空的int类型vector容器
vector<int> myvector;
//2.向vector中添加100个元素(值从0到99)
for (int i = 0; i < 100; i++)
{
myvector.push_back(i); // push_back()会在容器末尾插入元素,当容量不足时会自动扩容
}
//3.1:size():返回当前容器中实际存储的元素个数
cout << "size: " << (int)myvector.size() << '\n'; //注:这里添加了100个元素,所以size为100
//3.2:capacity():返回当前容器在不重新分配内存的情况下,最多能容纳的元素个数
cout << "capacity: " << (int)myvector.capacity() << '\n';
/* 说明:
* 1. 由于vector的扩容策略(通常是翻倍增长),capacity会大于或等于size
* 2. 此处添加100个元素后,capacity可能是128(取决于具体实现)
*/
return 0;
}

在这里插入图片描述
std::vector::empty

在这里插入图片描述
代码语言:javascript
AI代码解释
#include <iostream>
#include <vector>
using namespace std;
int main()
{
//1.创建一个空的int类型vector容器
vector<int> myvector;
//2.用于存储容器元素的总和
int sum(0);
//3.向vector中添加10个元素,值从1到10
for (int i = 1; i <= 10; i++)
{
myvector.push_back(i);
}
//4.empty()方法用于判断容器是否为空,返回true表示空,false表示非空
while (!myvector.empty()) //循环条件:当容器不为空时继续执行
{
//4.1:back()方法返回容器中最后一个元素的引用
sum += myvector.back();
//4.2:pop_back()方法移除容器中最后一个元素(不会返回元素值)
myvector.pop_back();
}
//5.输出所有元素的总和
cout << "total: " << sum << '\n';
return 0;
}

在这里插入图片描述
std::vector::resize

在这里插入图片描述
代码语言:javascript
AI代码解释
#include <iostream>
#include <vector>
using namespace std;
int main()
{
//1.创建一个存储int类型的vector容器
vector<int> myvector;
//2.向vector中添加初始元素:1到9
for (int i = 1; i < 10; i++)
{
myvector.push_back(i);
}
//3.调整vector大小为5,超出部分的元素会被删除
myvector.resize(5);
//4.调整vector大小为8,新增的3个元素使用100填充
myvector.resize(8, 100);
//5.调整vector大小为12,新增的4个元素使用默认值0填充(int类型的默认值)
myvector.resize(12);
//6.输出vector中的所有元素
cout << "myvector容器中内容为:";
for (int i = 0; i < myvector.size(); i++)
{
cout << ' ' << myvector[i];
}
cout << '\n';
return 0;
}

在这里插入图片描述
std::vector::reserve

在这里插入图片描述
代码语言:javascript
AI代码解释
#include <iostream>
#include <vector>
using namespace std;
int main()
{
//1.定义一个size_type类型的变量,用于存储容器的容量
vector<int>::size_type sz;
/*-------------------------情况一:未进行reserve()-------------------------*/
cout << "-------未进行reserve()-------" << endl;
//2.创建第一个vector容器foo
vector<int> foo;
//3.获取foo的初始容量(此时为空,容量通常为0)
sz = foo.capacity();
cout << "making foo grow:\n";
//4.向foo中添加100个元素(0到99)
for (int i = 0; i < 100; ++i)
{
//4.1:向vector容器尾插入元素
foo.push_back(i);
//4.1:检容量是否发生变化 ---> 如果发生了变化
if (sz != foo.capacity())
{
//4.2.1:更新容量值
sz = foo.capacity();
//4.2.2:输出新的容量
cout << "capacity changed: " << sz << '\n';
}
}
/* 说明:
* 1. foo没有预先分配空间,每次容量不足时会自动扩容
* 2. 通常vector的扩容策略是翻倍增长(不同编译器可能有差异)
*/
/*-------------------------情况二:进行reserve()-------------------------*/
cout << "\n-------进行reserve()-------" << endl;
//5.创建第二个vector容器bar
vector<int> bar;
//6.获取bar的初始容量
sz = bar.capacity();
cout << "making bar grow:\n";
//7.预先为bar分配至少能容纳100个元素的空间
bar.reserve(100);
//8.向bar中添加100个元素(0到99)
for (int i = 0; i < 100; ++i)
{
//8.1:向vector容器尾插入元素
bar.push_back(i);
//8.1:检容量是否发生变化 ---> 如果发生了变化
if (sz != bar.capacity())
{
//8.2.1:更新容量值
sz = bar.capacity();
//8.2.2:输出新的容量
cout << "capacity changed: " << sz << '\n';
}
}
/* 说明:
* 1. bar预先分配了足够的空间,添加100个元素过程中不会发生容量变化
*/
return 0;
}

在这里插入图片描述
3. 访问操作

在这里插入图片描述
|
访问相关接口 |
接口说明 |
|---|---|
|
operator [] |
重载的下标运算符,可像访问数组元素一样直接访问 vector 中的元素提供高效的随机访问方式 |
更多推荐




所有评论(0)