动态数组
用于存储动态大小的数组,提供了快速的随机访问和数组型接口,并能够在运行时动态增长或收缩(尾部添加/删除操作)。
#include <vector>
#include <iostream>
int main() {
#if 0
std::vector<int> vec = {
10, 20, 30};
#else
// 初始化一个空的 vector
std::vector<int> vec;
// 添加元素至末尾
vec.push_back(10);
vec.push_back(20);
vec.push_back(30);
#endif
// 访问元素
std::cout << "First element: " << vec[0] << '\n'; // 使用下标操作符
std::cout << "Second element: " << vec.at(1) << '\n'; // 使用 .at() 方法,带边界检查
// 获取 vector 的大小
std::cout << "The vector size is: " << vec.size() << '\n';
// 遍历 vector
for (size_t i = 0; i < vec.size(); ++i) {
std::cout << vec[i] << ' ';
}
std::cout << '\n';
// 使用迭代器遍历
for (auto it = vec.begin(); it != vec.end(); ++it) {
std::cout << *it << ' ';
}
std::cout << '\n';
// 使用范围基于的 for 循环
for (int num : vec) {
std::cout << num << ' ';
}
std::cout << '\n';
// 移除最后一个元素
vec.pop_back();
// 清空 vector
vec.clear();
return 0;
}
选择std::vector时应该注意的是,为了支持动态扩展,它可能会在内存中实现多次分配和复制。当vector容量不足以容纳更多元素时,它将进行重新分配,并将所有元素复制到新的内存地址。为了减少这种分配和复制的开销,如果知道大致所需的容量,可以使用reserve()方法预先分配足够的空间。
双端动态数组
允许在容器的两端快速插入和删除对象。与 std::vector 不同的是,std::deque 支持在两端高效地添加或移除元素,非常适合用作队列或双端队列数据结构。
#include <deque>
#include <iostream>
int main() {
#if 0
std::deque<int> d = {
10, 20 };
#else
std::deque<int> d;
// 在末尾添加元素
d.push_back(10);
d.push_back(20);
#endif
// 在开头添加元素
d.push_front(0);
d.push_front(-10);
// 访问元素
std::cout << "First element: " << d.front() << '\n'; // 访问第一个元素
std::cout << "Last element: " << d.back() << '\n'; // 访问最后一个元素
// 下标访问元素(但不如 std::vector 那么快)
std::cout << "Element at index 2: " << d[2] << '\n';
// 使用迭代器遍历
for (std::deque<int>::iterator it = d.begin(); it != d.end(); ++it) {
std::cout << *it << ' ';
}
std::cout << '\n';
// 使用范围基于的 for 循环
for (int n : d) {
std::cout << n << ' ';
}
std::cout << '\n';
// 删除元素
d.pop_front(); // 删除第一个元素
d.pop_back(); // 删除最后一个元素
return 0;
}
总的来说,std::deque 在需要灵活操作两端元素的场合表现良好,特别是当你不确定需要的容量大小,并且插入或删除操作在元素集的两端比中间更频繁时,它是一个很好的选择。由于其对两端操作的优化,std::deque 在特定应用场景下,性能可能优于 std::vector。
双向链表
通过双向指针连接各个元素。与数组(如 std::vector)或块状连续存储(如 std::deque)不同,std::list 中的元素在内存中并不连续存放,这使得它非常适合在中间位置进行快速插入和删除操作。
#include <list>
#include <iostream>
int main() {
// 初始化列表
#if 0
std::list<int> mylist = {
2, 4, 6, 8};
#else
std::list<int> mylist;
mylist.push_front(6);