Vector 是 C++ 标准模板库 (STL) 中最常用的容器之一,它本质上是一个动态数组,能够存储相同类型的元素,并可以根据需要自动调整大小。本文将详细介绍 vector 的常用函数及其使用方法。
一、Vector 的创建与初始化
1. 包含头文件
使用 vector 前,需要包含头文件 <vector>
:
#include <vector>
2. 创建 vector 对象
- 空 vector: 创建一个不包含任何元素的 vector。
std::vector<int> myVector;//创建一个 int 类型的空 vector
- 指定大小: 创建一个包含 n 个元素的 vector,默认值为 0。
std::vector<int> myVector(10); // 创建包含 10 个元素的 vector
- 指定大小和初始值: 创建一个包含 n 个元素的 vector,并将每个元素初始化为 value。
std::vector<int> myVector(10, 5); // 创建包含 10 个元素的 vector,每个元素初始化为 5
- 使用列表初始化: 使用花括号
{}
直接初始化 vector。
std::vector<int> myVector = {1, 2, 3, 4, 5};
- 拷贝构造: 使用另一个 vector 初始化新的 vector。
std::vector<int> myVector1 = {1, 2, 3};
std::vector<int> myVector2(myVector1); // 使用 myVector1 初始化 myVector2
- 多维数组: 用 vector 来存储 vector。
std::vector<vector<int>> myVector(line, vector<int>(column, 0));// 定义一个 line 行 column 列的 vector
二、Vector 的常用函数
1. 访问元素
- 使用下标运算符
[]
: 访问指定位置的元素,不进行越界检查。
int firstElement = myVector[0]; // 访问第一个元素
- 使用
at()
函数: 访问指定位置的元素,进行越界检查,越界时抛出std::out_of_range
异常。
int secondElement = myVector.at(1); // 访问第二个元素
- 使用
front()
和back()
函数: 分别访问第一个和最后一个元素。
int firstElement = myVector.front();
int lastElement = myVector.back();
2. 修改元素
- 使用下标运算符
[]
: 修改指定位置的元素。
myVector[0] = 10; // 修改第一个元素为 10
- 使用
at()
函数: 修改指定位置的元素。
myVector.at(1) = 20; // 修改第二个元素为 20
- 使用
assign()
函数: 将 vector 的内容替换为指定值或另一个 vector 的内容。
myVector.assign(5, 100); // 将 vector 的内容替换为 5 个 100
myVector.assign(myVector2.begin(), myVector2.end()); // 将 myVector 的内容替换为 myVector2 的内容
3. 添加元素
- 使用
push_back()
函数: 在 vector 的末尾添加一个元素。
myVector.push_back(6); // 在末尾添加元素 6
- 使用
insert()
函数: 在指定位置插入一个或多个元素。
myVector.insert(myVector.begin() + 2, 7); // 在第三个位置插入元素 7
myVector.insert(myVector.end(), {8, 9, 10}); // 在末尾插入元素 8, 9, 10
4. 删除元素
- 使用
pop_back()
函数: 删除 vector 的最后一个元素。
myVector.pop_back(); // 删除最后一个元素
- 使用
erase()
函数: 删除指定位置或范围内的元素。
myVector.erase(myVector.begin() + 2); // 删除第三个元素
myVector.erase(myVector.begin(), myVector.begin() + 3); // 删除前三个元素
- 使用
clear()
函数: 删除 vector 中的所有元素。
myVector.clear(); // 删除所有元素
5. 获取 vector 信息
- 使用
size()
函数: 获取 vector 中元素的个数。
int size = myVector.size();
- 使用
capacity()
函数: 获取 vector 当前分配的存储空间大小。
int capacity = myVector.capacity();
- 使用
empty()
函数: 判断 vector 是否为空。
if (myVector.empty()) {
// vector 为空
}
6. 其他操作
- 使用
swap()
函数: 交换两个 vector 的内容。
myVector1.swap(myVector2); // 交换 myVector1 和 myVector2 的内容
- 使用
resize()
函数: 改变 vector 的大小。
myVector.resize(15); // 将 vector 的大小改为 15,新增元素初始化为 0
myVector.resize(20, 100); // 将 vector 的大小改为 20,新增元素初始化为 100
- 使用
reserve()
函数: 预留存储空间,避免频繁重新分配内存。
myVector.reserve(100); // 预留 100 个元素的存储空间
三、Vector 的迭代器
Vector 提供了迭代器用于遍历元素:
begin()
: 返回指向第一个元素的迭代器。end()
: 返回指向最后一个元素之后位置的迭代器。rbegin()
: 返回指向最后一个元素的逆向迭代器。rend()
: 返回指向第一个元素之前位置的逆向迭代器。
for (auto it = myVector.begin(); it != myVector.end(); ++it) {
std::cout << *it << " ";
}
四、Vector 的优势与劣势
优势:
- 动态数组: 可以根据需要自动调整大小,无需手动管理内存。
- 高效访问: 支持随机访问,访问任意元素的时间复杂度为 O(1)。
- 丰富的操作: 提供了丰富的成员函数,方便进行各种操作。
劣势:
- 插入/删除效率低: 在中间位置插入或删除元素需要移动后续元素,时间复杂度为 O(n)。
- 内存占用: 需要额外的内存空间来存储容量信息。
五、总结
Vector 是 C++ 中非常实用的容器,它提供了动态数组的功能,并支持各种操作。掌握 vector 的用法对于编写高效、易维护的 C++ 代码至关重要。