这篇文章是关于 C++所有数据结构概览中的 list 特辑
往期 STL 容器看点:
首先,请确保包含了头文件:
#include <vector>
1. 构造函数 (Constructors)
用于创建和初始化一个 vector
。
-
vector()
- 功能:默认构造函数,创建一个空的
vector
。 - 示例:
std::vector<int> v1;
- 功能:默认构造函数,创建一个空的
-
vector(size_type count, const T& value)
-
功能:创建包含
count
个元素的vector
,每个元素都被初始化为value
。 -
示例:
std::vector<int> v2(5, 10); // 创建包含 5 个 int 的 vector,每个都是 10
-
-
vector(size_type count)
(C++11 起)-
功能:创建包含
count
个元素的vector
,并对每个元素进行值初始化(对于int
等内置类型,就是零初始化)。 -
示例:
std::vector<int> v3(5); // 创建包含 5 个 int 的 vector,每个都是 0
-
-
vector(InputIt first, InputIt last)
-
功能:使用迭代器范围
[first, last)
内的元素来构造vector
。 -
示例:
int arr[] = {1, 2, 3, 4, 5}; std::vector<int> v4(arr, arr + 5);
-
-
vector(const vector& other)
-
功能:拷贝构造函数,创建一个与
other
内容相同的vector
。 -
示例:
std::vector<int> v5(v4);
-
-
vector(vector&& other)
(C++11)-
功能:移动构造函数,接管
other
的资源,other
将变为空。这比拷贝高效。 -
示例:
std::vector<int> v6(std::move(v5));
-
-
vector(std::initializer_list<T> init)
(C++11)-
功能:使用初始化列表来构造
vector
。这是最现代、最常用的方式之一。 -
示例:
std::vector<int> v7 = {1, 2, 3, 4, 5};
-
2. 迭代器 (Iterators)
用于遍历 vector
中的元素。
-
begin() / cbegin()
- 功能:返回指向
vector
第一个元素的迭代器。cbegin()
返回一个const
迭代器。
- 功能:返回指向
-
end() / cend()
- 功能:返回指向
vector
尾端(最后一个元素的下一个位置)的迭代器。cend()
返回一个const
迭代器。
- 功能:返回指向
-
rbegin() / crbegin()
- 功能:返回指向
vector
最后一个元素的反向迭代器。
- 功能:返回指向
-
rend() / crend()
- 功能:返回指向
vector
第一个元素之前位置的反向迭代器。
- 功能:返回指向
示例:
std::vector<int> v = {10, 20, 30};
// 正向遍历
for(auto it = v.begin(); it != v.end(); ++it) {
std::cout << *it << " "; // 输出: 10 20 30
}
// 反向遍历
for(auto it = v.rbegin(); it != v.rend(); ++it) {
std::cout << *it << " "; // 输出: 30 20 10
}
3. 容量 (Capacity)
管理 vector
的存储空间。
-
size()
- 功能:返回
vector
中实际元素的数量。
- 功能:返回
-
capacity()
- 功能:返回在不重新分配内存的情况下,
vector
可以容纳的元素数量。capacity() >= size()
恒成立。
- 功能:返回在不重新分配内存的情况下,
-
empty()
- 功能:检查
vector
是否为空(即size() == 0
),返回true
或false
。
- 功能:检查
-
reserve(size_type new_cap)
- 功能:预留存储空间。请求将
capacity()
增加到至少new_cap
。如果new_cap
大于当前的capacity()
,会发生内存重分配。这是一个重要的性能优化技巧,可以避免在连续push_back
时发生多次内存重分配。
- 功能:预留存储空间。请求将
-
shrink_to_fit()
(C++11)- 功能:请求减少
capacity()
以匹配size()
,释放未使用的内存。
- 功能:请求减少
-
resize(size_type count)
- 功能:改变
vector
的大小。如果count > size()
,则在末尾添加新元素(值初始化);如果count < size()
,则销毁末尾多余的元素。
- 功能:改变
-
resize(size_type count, const T& value)
- 功能:同上,但在扩容时使用
value
作为新元素的初始值。
- 功能:同上,但在扩容时使用
示例:
std::vector<int> v;
v.reserve(100); // 预分配100个元素的空间,避免后续push_back重分配
std::cout << "Size: " << v.size() << ", Capacity: " << v.capacity() << std::endl; // Size: 0, Capacity: 100
v.push_back(1); v.push_back(2);
std::cout << "Size: " << v.size() << ", Capacity: " << v.capacity() << std::endl; // Size: 2, Capacity: 100
v.resize(10);
std::cout << "Size: " << v.size() << ", Capacity: " << v.capacity() << std::endl; // Size: 10, Capacity: 100
v.shrink_to_fit();
std::cout << "Size: " << v.size() << ", Capacity: " << v.capacity() << std::endl; // Size: 10, Capacity: 10
4. 元素访问 (Element Access)
获取 vector
中的单个元素。
-
operator[](size_type pos)
- 功能:访问指定位置
pos
的元素。不进行边界检查,速度快但有风险。
- 功能:访问指定位置
-
at(size_type pos)
- 功能:访问指定位置
pos
的元素。进行边界检查,如果pos
超出范围,会抛出std::out_of_range
异常。更安全。
- 功能:访问指定位置
-
front()
- 功能:返回对第一个元素的引用。
-
back()
- 功能:返回对最后一个元素的引用。
-
data()
(C++11)- 功能:返回指向底层连续内存数组的指针。可用于与需要原始指针的 C 风格 API 交互。
示例:
std::vector<int> v = {10, 20, 30, 40};
int first = v[0]; // first = 10
int second = v.at(1); // second = 20
int last = v.back(); // last = 40
// v.at(10); // 会抛出异常
// int* p = v.data(); // p 指向数组 {10, 20, 30, 40}
5. 修改器 (Modifiers)
改变 vector
的内容。
-
assign(size_type count, const T& value)
- 功能:销毁
vector
中所有元素,并用count
个value
填充。
- 功能:销毁
-
assign(InputIt first, InputIt last)
- 功能:销毁
vector
中所有元素,并用迭代器范围[first, last)
的内容填充。
- 功能:销毁
-
push_back(const T& value)
/push_back(T&& value)
- 功能:在
vector
的末尾添加一个元素。这是最常用的操作之一。
- 功能:在
-
pop_back()
- 功能:移除
vector
的最后一个元素。
- 功能:移除
-
insert(const_iterator pos, const T& value)
(以及其他重载)- 功能:在迭代器
pos
指向的位置之前插入元素。可以插入单个元素、多个相同元素、一个迭代器范围的元素。这是一个 O(n) 操作。
- 功能:在迭代器
-
erase(const_iterator pos)
/erase(const_iterator first, const_iterator last)
- 功能:移除迭代器
pos
指向的元素,或迭代器范围[first, last)
内的元素。这是一个 O(n) 操作。
- 功能:移除迭代器
-
emplace_back(Args&&... args)
(C++11)- 功能:在
vector
末尾就地构造一个元素,而不是先创建临时对象再拷贝。对于复杂对象,这比push_back
更高效。
- 功能:在
-
emplace(const_iterator pos, Args&&... args)
(C++11)- 功能:在迭代器
pos
指向的位置之前就地构造一个元素。
- 功能:在迭代器
-
swap(vector& other)
- 功能:与另一个
vector
交换内容。这是一个 O(1) 的高效操作,它只交换内部指针。
- 功能:与另一个
-
clear()
- 功能:移除所有元素,
size()
变为 0,但capacity()
通常不变。
- 功能:移除所有元素,
示例:
std::vector<int> v = {10, 20, 30};
v.push_back(40); // v: {10, 20, 30, 40}
v.pop_back(); // v: {10, 20, 30}
auto it = v.begin() + 1; // 指向 20
v.insert(it, 15); // v: {10, 15, 20, 30}
v.erase(v.begin()); // v: {15, 20, 30}
std::vector<int> v2;
v2.swap(v); // v2: {15, 20, 30}, v: {}
v2.clear(); // v2: {}
6. 非成员函数 (Non-member functions)
-
比较运算符 (
==
,!=
,<
,>
,<=
,>=
)- 功能:以字典序比较两个
vector
的内容。
- 功能:以字典序比较两个
-
std::swap(vector& a, vector& b)
- 功能:与成员函数
swap
等效,推荐使用这个非成员版本。
- 功能:与成员函数
-
std::erase(vector<T>& c, const U& value)
(C++20)- 功能:移除
c
中所有等于value
的元素。
- 功能:移除
-
std::erase_if(vector<T>& c, UnaryPredicate p)
(C++20)- 功能:移除
c
中所有使一元谓词p
返回true
的元素。
- 功能:移除
C++20 示例:
#if __cplusplus >= 202002L
std::vector<int> v = {1, 2, 3, 2, 4, 2, 5};
std::erase(v, 2); // v 变为 {1, 3, 4, 5}
std::vector<int> v2 = {1, -2, 3, -4, 5};
std::erase_if(v2, [](int x){ return x < 0; }); // v2 变为 {1, 3, 5}
#endif
这份列表涵盖了 std::vector
的几乎所有日常使用和性能调优所需的操作。掌握它们,尤其是容量管理和修改器函数,是高效使用 std::vector
的关键。