主题
vector
在 C++ 中,vector
是标准模板库(STL)提供的动态数组容器。它具有动态调整大小的能力,可以存储任何类型的数据。vector
提供了方便的接口来进行元素的插入、删除、访问等操作。与传统的数组不同,vector
可以根据需要自动扩展其容量,使得在使用时更加灵活和高效。
vector 的基本操作
1. 创建 vector
vector
可以通过多种方式进行初始化,如空初始化、指定大小初始化以及通过列表初始化。
cpp
#include <iostream>
#include <vector>
int main() {
// 空初始化
std::vector<int> vec1;
// 使用指定大小初始化
std::vector<int> vec2(5, 10); // 创建一个大小为 5,每个元素为 10 的 vector
// 使用初始化列表初始化
std::vector<int> vec3 = {1, 2, 3, 4, 5};
// 打印初始化后的 vector
for (int val : vec2) {
std::cout << val << " "; // 输出: 10 10 10 10 10
}
std::cout << std::endl;
return 0;
}
2. 添加元素
使用 push_back
可以将元素添加到 vector
的末尾:
cpp
#include <iostream>
#include <vector>
int main() {
std::vector<int> vec = {1, 2, 3};
// 添加元素到末尾
vec.push_back(4);
for (int val : vec) {
std::cout << val << " "; // 输出: 1 2 3 4
}
return 0;
}
3. 访问元素
可以使用索引操作符([]
)或 at()
函数来访问 vector
中的元素。at()
会进行范围检查,而 []
不会。
cpp
#include <iostream>
#include <vector>
int main() {
std::vector<int> vec = {10, 20, 30, 40};
std::cout << "Element at index 1: " << vec[1] << std::endl; // 输出: 20
std::cout << "Element at index 2: " << vec.at(2) << std::endl; // 输出: 30
return 0;
}
4. 删除元素
vector
提供了多种方法来删除元素:
- 使用
pop_back()
删除末尾的元素。 - 使用
erase()
删除指定位置的元素。 - 使用
clear()
清空所有元素。
cpp
#include <iostream>
#include <vector>
int main() {
std::vector<int> vec = {10, 20, 30, 40};
// 删除末尾元素
vec.pop_back();
// 删除指定位置的元素
vec.erase(vec.begin() + 1); // 删除第二个元素
// 清空所有元素
vec.clear();
std::cout << "Size after clear: " << vec.size() << std::endl; // 输出: 0
return 0;
}
5. 访问大小和容量
vector
提供了 size()
和 capacity()
函数来获取当前容器的大小和容量。
size()
返回容器中当前元素的数量。capacity()
返回容器在不重新分配内存的情况下可以容纳的最大元素数量。
cpp
#include <iostream>
#include <vector>
int main() {
std::vector<int> vec = {1, 2, 3, 4};
std::cout << "Size: " << vec.size() << std::endl; // 输出: 4
std::cout << "Capacity: " << vec.capacity() << std::endl; // 输出: 4
return 0;
}
6. 迭代器
vector
支持使用迭代器进行遍历,可以使用 begin()
和 end()
获取迭代器。
cpp
#include <iostream>
#include <vector>
int main() {
std::vector<int> vec = {1, 2, 3, 4};
// 使用迭代器遍历
for (auto it = vec.begin(); it != vec.end(); ++it) {
std::cout << *it << " "; // 输出: 1 2 3 4
}
return 0;
}
vector 的优势
- 动态扩展:
vector
能够自动扩展大小,避免了固定大小数组的限制。 - 随机访问:
vector
提供常数时间的随机访问,因此可以高效地访问任何元素。 - 内存连续性:
vector
内部是基于动态数组实现的,因此其元素在内存中是连续存储的,这使得它比其他容器(如链表)更具性能优势。
vector 的局限性
- 插入/删除效率:在
vector
中间插入或删除元素的效率较低,因为这需要移动其他元素来保持顺序。 - 内存重分配:当
vector
超过当前容量时,会重新分配内存,这可能导致性能下降。
小结
vector
是一个非常灵活且高效的容器,适用于需要频繁访问和动态调整大小的场景。掌握 vector
的基本操作和使用场景,可以有效提高 C++ 编程的效率和灵活性。