std::vector 构造函数接口说明
| 构造函数声明 | 功能说明 |
|---|---|
vector() |
无参构造函数 :创建一个空的 vector,size() == 0。 |
vector(size_type n, const value_type& val = value_type()) |
填充构造函数 :构造包含 n 个元素的 vector,每个元素为 val 的拷贝;若未提供 val,则使用值初始化(如 int 初始化为 0)。 |
vector(const vector& x) |
拷贝构造函数 :创建 x 的副本,新 vector 与 x 内容相同、独立存储。 |
template <class InputIterator><br>vector(InputIterator first, InputIterator last) |
范围构造函数 :用迭代器区间 [first, last) 中的元素构造 vector(左闭右开)。 |
代码演示
cpp
#include <iostream>
#include <vector>
int main() {
// 1. 无参构造
std::vector<int> v1;
std::cout << "v1.size() = " << v1.size() << "\n"; // 输出: 0
// 2. 填充构造 (5 个 3)
std::vector<int> v2(5, 3);
for (int x : v2) std::cout << x << " "; // 输出: 3 3 3 3 3
std::cout << "\n";
// 3. 拷贝构造
std::vector<int> v3(v2); // 或 std::vector<int> v3 = v2;
std::cout << "v3.size() = " << v3.size() << "\n"; // 输出: 5
// 4. 范围构造(从数组)
int arr[] = {10, 20, 30};
std::vector<int> v4(arr, arr + 3);
for (int x : v4) std::cout << x << " "; // 输出: 10 20 30
std::cout << "\n";
return 0;
}
迭代器 begin() 与 end()
-
begin()- 返回指向 第一个元素 的迭代器。
- 类型:
iterator(非常量)或const_iterator(常量容器或使用cbegin())。
-
end()- 返回指向 最后一个元素之后位置 的迭代器(不指向有效数据,仅作边界标记)。
- 类型:
iterator或const_iterator。

用于正向遍历容器。
示例:
cpp
std::vector<int> v = {10, 20, 30};
for (auto it = v.begin(); it != v.end(); ++it) {
std::cout << *it << " "; // 输出:10 20 30
}
2. rbegin() 与 rend()
-
rbegin()返回一个 反向迭代器(
reverse_iterator) ,指向容器中 最后一个元素。 -
rend()返回一个 反向迭代器(
reverse_iterator) ,指向容器中 第一个元素之前的位置,作为反向遍历的结束标志(不可解引用)。
用于从后向前遍历容器。
注意:对反向迭代器执行
++操作,逻辑上是向前移动(即向容器开头方向移动)。
示例:
cpp
#include <iostream>
#include <vector>
int main() {
std::vector<int> v = {1, 2, 3, 4, 5};
// 反向遍历
for (auto rit = v.rbegin(); rit != v.rend(); ++rit) {
std::cout << *rit << " ";
}
// 输出:5 4 3 2 1
return 0;
}
vector 容量与空间管理接口说明
1. 核心容量查询接口
| 接口 | 返回类型 | 功能说明 |
|---|---|---|
size() |
size_t |
返回当前容器中 实际存储的元素个数。 |
capacity() |
size_t |
返回当前已分配的 内存容量(最多可容纳元素数,无需重新分配)。 |
empty() |
bool |
判断容器是否为空(等价于 size() == 0)。 |
2. 空间调整接口对比(重点)
| 操作 | 是否改变 size() |
是否可能改变 capacity() |
是否初始化新元素 | 主要用途 |
|---|---|---|---|---|
reserve(n) |
否 | 是(仅当 n > capacity()) |
否 | 预分配内存,避免频繁扩容 |
resize(n, val = T()) |
是 | 是(若 n > capacity()) |
是 | 调整有效元素数量,并用指定值(或默认值)初始化新增元素 |
3. 接口详解
size()
- 表示 vector 中当前有多少个有效元素。
- 可通过
push_back、pop_back、resize等操作改变。
capacity()
- 表示底层已分配的最大可容纳元素数量 ,不等于
size()。 - 当
size() == capacity()时,下一次插入会触发扩容(reallocate)。
empty()
- 快速判断容器是否为空,等价于
size() == 0,但语义更清晰。
reserve(n)
- 仅分配原始内存,不构造任何对象。
- 不改变
size(),因此不能通过operator[]访问未初始化的位置。 - 若
n <= capacity(),则无任何操作。 - 常用于性能优化:提前预留空间,避免多次拷贝。
resize(n, val)
- 调整
size()到n:- 若
n < size():销毁多余元素(调用析构函数)。 - 若
n > size():在尾部追加n - size()个元素,使用val(或默认构造)初始化。
- 若
- 若所需空间超过当前
capacity(),会先扩容再初始化。
vector 增删查改接口说明
1. 核心操作接口速查表
| 操作 | 是否为 vector 成员函数 | 功能说明 | 时间复杂度 |
|---|---|---|---|
push_back(val)(重点) |
是 | 在尾部插入一个元素 | O(1)(均摊) |
pop_back()(重点) |
是 | 删除尾部最后一个元素 | O(1) |
operator[](pos) |
是 | 通过下标随机访问元素 | O(1) |
insert(pos, val) |
是 | 在迭代器 pos 位置前插入元素 |
O(n) |
erase(pos) |
是 | 删除迭代器 pos 位置的元素 |
O(n) |
swap(other) |
是 | 交换两个 vector 的内容(实际只是交换了他们的地址) | O(1) |
find(first, last, val) |
否(属于 <algorithm>) |
在 [first, last) 范围内查找值 |
O(n) |
注意:
find不是vector的成员函数,而是 STL 算法库中的泛型算法。
push_back(const T& val) / push_back(T&& val)
-
功能 :在 vector 尾部插入一个元素。
-
特点 :
- 若
size() == capacity(),会触发扩容(可能重新分配内存并拷贝/移动所有元素)。 - 支持左值和右值引用(C++11 起)。
- 若
-
示例 :
cppstd::vector<int> v; v.push_back(10); // v = {10}
pop_back()
- 是
vector成员函数。 - 功能:删除
vector尾部的最后一个元素。 - 不返回被删除的元素(若需获取,应先用
back()读取)。 - 要求容器非空,否则行为未定义(可能导致程序崩溃)。
- 时间复杂度为 O(1)。
operator[](pos)
- 是
vector成员函数。 - 功能:通过下标
pos直接访问vector中的元素,返回对应位置的引用(可读写)。 - 不进行边界检查:若
pos超出范围(pos >= size()),行为未定义(可能引发越界访问错误)。 - 若需安全访问,应使用
.at(pos)(越界时抛出std::out_of_range异常)。 - 时间复杂度为 O(1)。
insert(pos, val)
- 是
vector成员函数。 - 功能:在迭代器
pos所指向的位置之前 插入一个元素val。 - 插入后,原
pos及其后的所有元素向右移动一位,vector的size()增加 1。 - 若当前容量不足,会触发重新分配内存(扩容),导致所有迭代器、指针和引用失效。
- 返回指向新插入元素的迭代器。
- 时间复杂度为 O(n),主要开销在于移动插入点之后的所有元素。
erase(pos)
- 是
vector成员函数。 - 功能:删除迭代器
pos所指向的单个元素。 - 删除后,该位置之后的所有元素向前移动一位以填补空缺,
vector的size()减 1。 - 返回指向被删除元素下一个位置 的迭代器(即原
pos + 1处的新元素),可用于连续删除操作。 (重要) - 调用后,被删除位置及之后的迭代器、指针和引用均失效(若发生内存重分配,则所有迭代器都失效)。
- 时间复杂度为 O(n),主要开销在于移动被删元素之后的所有元素。
swap(other)
- 是
vector成员函数。 - 功能:与另一个同类型的
vector对象other交换全部内容(包括元素数据、大小size()和容量capacity())。 - 底层实现通常仅交换内部指针和控制成员(如指向数据的指针、
size、capacity),不复制或移动任何元素,因此非常高效。 - 所有迭代器、引用和指针在交换后仍有效,但会指向对方容器中的对应位置(即"身份互换")。
- 时间复杂度为 O(1)。