vector
是 C++ 标准库(STL)中最常用的容器之一,它提供了一个动态数组的实现,能够根据需要自动扩展或收缩。vector
是一个线性数据结构,具有高效的随机访问能力和动态扩展能力,广泛应用于需要频繁增删元素且对随机访问要求较高的场景。
1. vector
类简介
vector
是 C++ 标准模板库(STL)中提供的一种容器类,它类似于动态数组(dynamic array)。不同于普通的数组,vector
可以在运行时动态调整大小,因此它适合处理元素数量未知、需要灵活增减的场景。
基本特点:
- 动态大小:
vector
会根据元素的增加或减少自动调整大小。 - 随机访问:支持通过下标快速访问元素,类似于数组,具有常数时间复杂度 O(1)。
- 内存连续性:与数组类似,
vector
内部存储的数据是连续的,因此其元素存储在内存中是一个连续的块,这也让它能够高效地访问元素。 - 元素添加和删除:可以在末尾高效地插入元素,也支持在其他位置插入或删除,但这些操作的时间复杂度可能较高。
2. vector
的基本操作
创建 vector
对象
#include <iostream>
#include <vector>
int main() {
// 创建一个空的 vector
std::vector<int> vec;
// 创建一个大小为 5 的 vector,初始化为 0
std::vector<int> vec2(5, 0);
// 创建一个初始化值的 vector
std::vector<int> vec3 = {1, 2, 3, 4, 5};
// 创建一个同类型的 vector,并拷贝另一个 vector
std::vector<int> vec4(vec3);
return 0;
}
访问元素
#include <iostream>
#include <vector>
int main() {
std::vector<int> vec = {1, 2, 3, 4, 5};
// 使用下标访问元素
std::cout << "Element at index 2: " << vec[2] << std::endl;
// 使用 at() 函数访问元素(会进行边界检查)
std::cout << "Element at index 2: " << vec.at(2) << std::endl;
// 获取第一个和最后一个元素
std::cout << "First element: " << vec.front() << std::endl;
std::cout << "Last element: " << vec.back() << std::endl;
return 0;
}
添加和删除元素
#include <iostream>
#include <vector>
int main() {
std::vector<int> vec = {1, 2, 3};
// 添加元素到末尾
vec.push_back(4);
vec.push_back(5);
// 删除末尾元素
vec.pop_back();
// 插入元素到指定位置
vec.insert(vec.begin() + 1, 6); // 在第二个位置插入 6
// 删除指定位置的元素
vec.erase(vec.begin() + 2); // 删除第三个元素
// 清空 vector
vec.clear();
return 0;
}
获取容量和大小
#include <iostream>
#include <vector>
int main() {
std::vector<int> vec = {1, 2, 3, 4, 5};
std::cout << "Size of vector: " << vec.size() << std::endl;
std::cout << "Capacity of vector: " << vec.capacity() << std::endl;
std::cout << "Is vector empty? " << (vec.empty() ? "Yes" : "No") << std::endl;
return 0;
}
size()
:返回当前vector
中的元素个数。capacity()
:返回vector
当前可以容纳的最大元素数量。empty()
:判断vector
是否为空。
迭代器操作
#include <iostream>
#include <vector>
int main() {
std::vector<int> vec = {1, 2, 3, 4, 5};
// 使用迭代器遍历 vector
for (auto it = vec.begin(); it != vec.end(); ++it) {
std::cout << *it << " ";
}
std::cout << std::endl;
return 0;
}
其他常用方法
resize(n)
:改变vector
的大小,如果新大小比当前大小大,新的元素会被默认初始化;如果小,则丢弃超出部分。shrink_to_fit()
:请求减少容量到适合大小,释放未使用的内存。swap(other)
:交换两个vector
的内容。
#include <iostream>
#include <vector>
int main() {
std::vector<int> vec1 = {1, 2, 3};
std::vector<int> vec2 = {4, 5, 6};
// 交换 vec1 和 vec2 的内容
vec1.swap(vec2);
for (int num : vec1) {
std::cout << num << " "; // 输出 4 5 6
}
std::cout << std::endl;
return 0;
}
3. vector
的优缺点
优点:
- 快速随机访问:可以通过下标直接访问元素,时间复杂度为 O(1)。
- 动态扩展:当容器容量不足时,
vector
会自动扩展,可以容纳更多的元素。 - 内存连续性:
vector
内部存储的数据是连续的,这对于缓存友好性和数据的快速访问有很大的好处。
缺点:
- 插入和删除元素的性能差:在
vector
的开头或中间插入和删除元素时,会导致大量的元素移动,因此这些操作的时间复杂度为 O(n)。 - 内存重分配:当
vector
超过当前容量时,会重新分配更大的内存块并复制数据,可能会造成性能开销。
4. 总结
vector
是 C++ STL 中非常强大的一个容器类,它提供了动态数组的高效实现,支持高效的随机访问和动态扩展。对于需要频繁插入、删除元素的场景,虽然 vector
在末尾操作表现出色,但如果在中间或前面插入、删除数据时,性能会有所下降。通过合理地选择容器和操作方式,可以大大提高程序的性能。
发布者:myrgd,转载请注明出处:https://www.object-c.cn/4558