Vector
vector 简介
vector
是C++标准模板库(STL)中最简单的一种容器。
从概念上讲,vector
可以被认为是一个动态数组。这意味着它可以像普通数组那样通过索引进行随机访问,访问任何元素的时间复杂度是常数级别的。
在实现方面,vector
的核心是使用一块连续的内存空间来存储元素,这与普通的数组完全一致。正是因为这种内存布局的连续性,才使得它能够支持快速的随机访问。
vector
最重要的特性之一是其动态性。与普通数组在创建时就需要固定大小不同,vector
的大小可以在程序运行过程中动态地改变。当您尝试向一个已经满的 vector
中插入新的元素时,vector
会自动进行以下操作:
- 分配一块更大的内存块。
- 将原有的元素从旧的内存块拷贝到新的内存块中。
- 释放旧的内存块。
- 在新分配的内存块中插入新的元素。
因此,vector
是一个灵活的数组,其大小可以动态地改变。您可以使用 push_back()
在 vector
的末尾添加元素,如果需要,vector
会自动管理内存的分配和释放。您还可以使用 size()
获取当前 vector
中元素的数量,使用 capacity()
获取当前 vector
的容量(即在重新分配内存之前可以容纳的元素数量),并可以使用 reserve()
来预先分配一定的容量。
需要注意的是,由于 vector
在内存中是连续存储的,因此在任意位置(除了末尾)插入或删除元素可能涉及到元素的移动,这可能会影响性能。例如,在 vector
的头部插入元素 push_front()
不是一个高效的操作,因为它需要将所有现有元素都向后移动一位。如果您需要在序列的开头或中间频繁地进行插入和删除操作,那么 list
(链表)可能是一个更合适的选择。
总而言之,vector
是一种使用连续内存实现的动态数组,它提供了快速的随机访问和自动的内存管理,是STL中最常用和最基础的容器之一。要使用 vector
,您需要在代码中包含头文件 <vector>
。
vector 常用成员函数
成员函数 | 描述 | 来源 |
---|---|---|
assign(iterator first, iterator last) |
移除所有元素,并插入由迭代器 first 和 last 指示范围内的元素。 |
|
assign(size_type n, const T& el = T()) |
移除所有元素,并插入 n 个 el 的副本。如果未提供 el ,则使用 T() 进行默认构造。 |
|
at(size_type n) |
返回位于位置 n 的元素。 |
|
back() |
返回最后一个元素。 | |
begin() |
返回一个指向第一个元素的迭代器。 | |
capacity() |
返回 vector 可以存储的元素数量(即在需要重新分配内存之前可以容纳的元素数量)。 |
|
clear() |
移除所有元素。 | |
empty() |
如果 vector 不包含任何元素则返回 true ,否则返回 false 。 |
|
end() |
返回一个指向 vector 最后一个元素之后的位置的迭代器。 |
|
front() |
返回第一个元素。 | |
insert(iterator i, const T& el = T()) |
在迭代器 i 所引用的元素之前插入 el ,并返回一个指向新插入元素的迭代器。 |
|
insert(iterator i, size_type n, const T& el) |
在迭代器 i 所引用的元素之前插入 n 个 el 的副本。 |
|
insert(iterator i, iterator first, iterator last) |
在迭代器 i 所引用的元素之前插入由迭代器 first 和 last 指示范围内的元素。 |
|
max_size() |
返回 vector 可以容纳的最大元素数量。 |
|
operator[] |
下标运算符,用于访问指定位置的元素。 | |
pop_back() |
移除最后一个元素。 | |
push_back(const T& el) |
在 vector 的末尾插入 el 。 |
|
rbegin() |
返回一个指向最后一个元素的反向迭代器。 | |
rend() |
返回一个指向第一个元素之前的位置的反向迭代器。 | |
reserve(size_type n) |
预留足够的空间以容纳 n 个元素,如果当前的 capacity() 小于 n 。这不会改变 size() 。 |
|
resize(size_type n, const T& el = T()) |
改变 vector 的大小为 n 。如果 n 大于当前 size() ,则在末尾添加 n - size() 个值为 el 的元素;如果 n 小于当前 size() ,则移除末尾的元素。 |
|
size() |
返回 vector 中当前元素的数量。 |
|
swap(vector<T>& v) |
交换当前 vector 的内容与另一个 vector v 的内容。 |
|
vector() |
构造一个空 vector 。 |
|
vector(size_type n, const T& el = T()) |
构造一个包含 n 个 el 副本的 vector 。如果未提供 el ,则使用 T() 进行默认构造。 |
|
vector(iterator first, iterator last) |
构造一个包含由迭代器 first 和 last 指示范围内元素的 vector 。 |
|
vector(const vector<T>& v) |
拷贝构造函数,创建一个与 vector v 相同的副本。 |
vector 演示程序 (中文注释)
#include <iostream>
#include <vector>
#include <algorithm> // 包含 sort 等算法
using namespace std;
int main() {
// 声明并初始化一个空的整型 vector
vector<int> v1;
cout << "v1 的初始大小: " << v1.size() << endl;
cout << "v1 的初始容量: " << v1.capacity() << endl;
// 使用 push_back 在末尾添加元素
v1.push_back(10);
v1.push_back(20);
v1.push_back(30);
cout << "在 v1 末尾添加元素后的大小: " << v1.size() << endl;
cout << "在 v1 末尾添加元素后的容量: " << v1.capacity() << endl; // 容量可能会增加
// 使用 at() 和下标运算符 [] 访问元素
cout << "v1 的第一个元素 (使用 at()): " << v1.at(0) << endl;
cout << "v1 的第二个元素 (使用 []): " << v1 << endl;
// 使用 front() 和 back() 访问首尾元素
cout << "v1 的第一个元素 (使用 front()): " << v1.front() << endl;
cout << "v1 的最后一个元素 (使用 back()): " << v1.back() << endl;
// 使用 begin() 和 end() 获取迭代器并遍历 vector
cout << "v1 的元素: ";
for (vector<int>::iterator it = v1.begin(); it != v1.end(); ++it) {
cout << *it << " ";
}
cout << endl;
// 使用 insert() 在指定位置插入元素
v1.insert(v1.begin() + 1, 15); // 在第二个位置(索引为1)之前插入 15
cout << "在 v1 中间插入元素后: ";
for (int val : v1) { // 使用范围 for 循环遍历
cout << val << " ";
}
cout << endl;
// 使用 erase() 移除指定位置的元素
v1.erase(v1.begin() + 2); // 移除第三个位置(索引为2)的元素
cout << "从 v1 中移除一个元素后: ";
for (int val : v1) {
cout << val << " ";
}
cout << endl;
// 使用 size() 获取当前大小
cout << "v1 的当前大小: " << v1.size() << endl;
// 使用 empty() 检查是否为空
cout << "v1 是否为空? " << (v1.empty() ? "是" : "否") << endl;
// 使用 clear() 移除所有元素
v1.clear();
cout << "清空 v1 后的大小: " << v1.size() << endl;
cout << "v1 是否为空? " << (v1.empty() ? "是" : "否") << endl;
// 演示带有初始大小和默认值的构造函数
vector<int> v2(5, 0); // 创建一个包含 5 个 0 的 vector
cout << "v2 的内容: ";
for (int val : v2) {
cout << val << " ";
}
cout << endl;
// 演示使用迭代器范围构造 vector
int arr[] = {1, 3, 5, 7, 9};
vector<int> v3(arr, arr + sizeof(arr) / sizeof(int));
cout << "v3 的内容: ";
for (int val : v3) {
cout << val << " ";
}
cout << endl;
return 0;
}
这个程序演示了 vector
的一些基本操作,包括创建、添加元素、访问元素、插入和删除元素、获取大小和容量、以及清空 vector
。您可以编译并运行这段代码以观察 vector
成员函数的行为。