C++ std::vector 和 std::list 完全指南
目录
1. 基本操作对比
cpp
#include <iostream>
#include <vector>
#include <list>
using namespace std;
void printVector(const vector<int>& v) {
for (int x : v) cout << x << " ";
cout << endl;
}
void printList(const list<int>& l) {
for (int x : l) cout << x << " ";
cout << endl;
}
int main() {
cout << "========== 1. 基本操作对比 ==========" << endl;
// ----- vector 示例 -----
cout << "\n--- vector 基本操作 ---" << endl;
vector<int> vec;
// 添加元素
vec.push_back(10); // 末尾添加: [10]
vec.push_back(20); // [10, 20]
vec.push_back(30); // [10, 20, 30]
cout << "push_back后: ";
printVector(vec);
// 访问元素
cout << "vec[0]: " << vec[0] << endl; // 直接索引: 10
cout << "vec.at(1): " << vec.at(1) << endl; // 带边界检查: 20
cout << "vec.front(): " << vec.front() << endl; // 第一个: 10
cout << "vec.back(): " << vec.back() << endl; // 最后一个: 30
// 删除元素
vec.pop_back(); // 删除末尾: [10, 20]
cout << "pop_back后: ";
printVector(vec);
// ----- list 示例 -----
cout << "\n--- list 基本操作 ---" << endl;
list<int> lst;
// 添加元素(双向操作)
lst.push_back(10); // 末尾添加: [10]
lst.push_back(20); // [10, 20]
lst.push_front(5); // 开头添加: [5, 10, 20]
cout << "push系列后: ";
printList(lst);
// 访问元素(不能直接索引)
cout << "lst.front(): " << lst.front() << endl; // 第一个: 5
cout << "lst.back(): " << lst.back() << endl; // 最后一个: 20
// 删除元素
lst.pop_back(); // 删除末尾: [5, 10]
lst.pop_front(); // 删除开头: [10]
cout << "pop系列后: ";
printList(lst);
return 0;
}2. 插入和删除操作
cpp
#include <iostream>
#include <vector>
#include <list>
#include <iterator>
using namespace std;
void printVector(const vector<int>& v, const string& msg) {
cout << msg << ": ";
for (int x : v) cout << x << " ";
cout << endl;
}
void printList(const list<int>& l, const string& msg) {
cout << msg << ": ";
for (int x : l) cout << x << " ";
cout << endl;
}
int main() {
cout << "\n========== 2. 插入和删除操作 ==========" << endl;
// ----- vector 插入删除(较慢)-----
cout << "\n--- vector 插入删除 ---" << endl;
vector<int> vec = {1, 2, 3, 4, 5};
printVector(vec, "原始 vector");
// insert: 在指定位置插入
auto vit = vec.begin() + 2; // 指向第3个元素
vec.insert(vit, 99); // 在位置2插入
printVector(vec, "insert 99在位置2");
// erase: 删除指定位置
vit = vec.begin() + 3;
vec.erase(vit); // 删除位置3
printVector(vec, "erase 位置3");
// insert 多个元素
vit = vec.begin() + 1;
vec.insert(vit, 3, 88); // 插入3个88
printVector(vec, "insert 3个88在位置1");
// insert 迭代器范围
vector<int> temp = {100, 200};
vit = vec.end();
vec.insert(vit, temp.begin(), temp.end());
printVector(vec, "insert 范围在末尾");
// erase 范围
vec.erase(vec.begin() + 1, vec.begin() + 4);
printVector(vec, "erase 范围[1,4)");
// ----- list 插入删除(快速)-----
cout << "\n--- list 插入删除 ---" << endl;
list<int> lst = {1, 2, 3, 4, 5};
printList(lst, "原始 list");
// insert: 在指定位置插入
auto lit = lst.begin();
advance(lit, 2); // 移动到第3个元素
lst.insert(lit, 99); // 在位置2插入
printList(lst, "insert 99在位置2");
// erase: 删除指定位置
lit = lst.begin();
advance(lit, 3);
lst.erase(lit); // 删除位置3
printList(lst, "erase 位置3");
// insert 多个元素
lit = lst.begin();
advance(lit, 1);
lst.insert(lit, 3, 88); // 插入3个88
printList(lst, "insert 3个88在位置1");
// insert 迭代器范围
list<int> temp2 = {100, 200};
lit = lst.end();
lst.insert(lit, temp2.begin(), temp2.end());
printList(lst, "insert 范围在末尾");
// erase 范围
lit = lst.begin();
auto lit2 = lst.begin();
advance(lit, 1);
advance(lit2, 4);
lst.erase(lit, lit2); // 删除范围
printList(lst, "erase 范围[1,4)");
return 0;
}3. 特有操作
cpp
#include <iostream>
#include <vector>
#include <list>
using namespace std;
void printList(const list<int>& l, const string& msg) {
cout << msg << ": ";
for (int x : l) cout << x << " ";
cout << endl;
}
int main() {
cout << "\n========== 3. 特有操作 ==========" << endl;
// ----- vector 特有操作 -----
cout << "\n--- vector 特有操作 ---" << endl;
vector<int> vec;
// reserve: 预分配空间
vec.reserve(100);
cout << "reserve(100)后 capacity: " << vec.capacity() << endl;
// capacity: 获取当前容量
for (int i = 0; i < 10; i++) vec.push_back(i);
cout << "size: " << vec.size() << ", capacity: " << vec.capacity() << endl;
// shrink_to_fit: 释放多余内存
vec.shrink_to_fit();
cout << "shrink_to_fit后 capacity: " << vec.capacity() << endl;
// data: 获取底层数组指针
int* ptr = vec.data();
cout << "data()[0]: " << ptr[0] << endl;
// assign: 重新赋值
vec.assign(5, 100); // 5个100
cout << "assign(5,100)后: ";
for (int x : vec) cout << x << " ";
cout << endl;
// ----- list 特有操作 -----
cout << "\n--- list 特有操作 ---" << endl;
// merge: 合并两个已排序的list
list<int> list1 = {1, 3, 5, 7};
list<int> list2 = {2, 4, 6, 8};
list1.merge(list2); // list1必须已排序
printList(list1, "merge后 list1");
cout << "list2大小: " << list2.size() << endl;
// splice: 转移元素
list<int> list3 = {10, 20, 30};
list<int> list4 = {40, 50, 60};
auto it = list3.begin();
advance(it, 2);
list3.splice(it, list4); // 将list4所有元素转移到list3的it位置前
printList(list3, "splice后 list3");
cout << "list4大小: " << list4.size() << endl;
// remove: 删除特定值
list<int> list5 = {1, 2, 2, 3, 2, 4, 2};
list5.remove(2);
printList(list5, "remove(2)后");
// remove_if: 条件删除
list<int> list6 = {1, 2, 3, 4, 5, 6, 7, 8};
list6.remove_if([](int n) { return n % 2 == 0; }); // 删除偶数
printList(list6, "remove_if(偶数)后");
// unique: 去重
list<int> list7 = {1, 1, 2, 2, 2, 3, 3, 4};
list7.unique();
printList(list7, "unique去重后");
// reverse: 反转
list<int> list8 = {1, 2, 3, 4, 5};
list8.reverse();
printList(list8, "reverse反转后");
// sort: 排序
list<int> list9 = {5, 2, 8, 1, 9, 3};
list9.sort();
printList(list9, "sort排序后");
// sort 降序
list9.sort(greater<int>());
printList(list9, "sort降序后");
return 0;
}4. 迭代器操作
cpp
#include <iostream>
#include <vector>
#include <list>
#include <iterator>
using namespace std;
int main() {
cout << "\n========== 4. 迭代器操作 ==========" << endl;
vector<int> vec = {10, 20, 30, 40, 50};
list<int> lst = {10, 20, 30, 40, 50};
// ----- advance: 移动迭代器 -----
cout << "\n--- advance 用法 ---" << endl;
// vector 中使用(O(1))
auto vit = vec.begin();
advance(vit, 3); // vit += 3; vector的迭代器可以+; list的不可以
cout << "vector advance到位置3: " << *vit << endl; // 40
// list 中使用(O(n))
auto lit = lst.begin();
advance(lit, 3);
cout << "list advance到位置3: " << *lit << endl; // 40
// 向后移动(双向迭代器支持负数)
advance(lit, -2);
cout << "list advance向后2步: " << *lit << endl; // 20
// ----- next: 返回新迭代器 -----
cout << "\n--- next 用法 ---" << endl;
auto vit2 = vec.begin();
auto vit3 = next(vit2, 3); // vit2不变,vit3指向位置3
cout << "next后原迭代器: " << *vit2 << endl; // 10
cout << "next返回新迭代器: " << *vit3 << endl; // 40
// ----- prev: 向后移动返回新迭代器 -----
cout << "\n--- prev 用法 ---" << endl;
auto vit4 = vec.end();
auto vit5 = prev(vit4, 2);
cout << "prev从end向前2步: " << *vit5 << endl; // 40
// ----- 迭代器距离计算 -----
cout << "\n--- 距离计算 ---" << endl;
auto start = lst.begin();
auto end = lst.end();
int dist = distance(start, end);
cout << "list 元素个数: " << dist << endl; // 5
auto mid = next(start, dist / 2);
cout << "中间元素: " << *mid << endl; // 30
// ----- 不同迭代器类型对比 -----
cout << "\n--- 迭代器类型对比 ---" << endl;
// vector: 随机访问迭代器
cout << "vector随机访问: " << *(vec.begin() + 2) << endl; // ✅ 30
// list: 双向迭代器
// cout << *(lst.begin() + 2); // ❌ 编译错误
return 0;
}5. 遍历方式对比
cpp
#include <iostream>
#include <vector>
#include <list>
using namespace std;
int main() {
cout << "\n========== 5. 遍历方式对比 ==========" << endl;
vector<int> vec = {1, 2, 3, 4, 5};
list<int> lst = {1, 2, 3, 4, 5};
// ----- vector 遍历方式 -----
cout << "\n--- vector 遍历 ---" << endl;
// 1. 索引遍历(只适用于vector)
cout << "索引遍历: ";
for (size_t i = 0; i < vec.size(); ++i) {
cout << vec[i] << " ";
}
cout << endl;
// 2. 迭代器遍历
cout << "迭代器遍历: ";
for (auto it = vec.begin(); it != vec.end(); ++it) {
cout << *it << " ";
}
cout << endl;
// 3. 范围for循环
cout << "范围for: ";
for (int x : vec) {
cout << x << " ";
}
cout << endl;
// 4. 常量迭代器
cout << "const迭代器: ";
for (auto it = vec.cbegin(); it != vec.cend(); ++it) {
cout << *it << " ";
}
cout << endl;
// 5. 反向迭代器
cout << "反向迭代器: ";
for (auto rit = vec.rbegin(); rit != vec.rend(); ++rit) {
cout << *rit << " ";
}
cout << endl;
// ----- list 遍历方式 -----
cout << "\n--- list 遍历 ---" << endl;
// 1. 迭代器遍历(不能使用索引)
cout << "迭代器遍历: ";
for (auto it = lst.begin(); it != lst.end(); ++it) {
cout << *it << " ";
}
cout << endl;
// 2. 范围for循环
cout << "范围for: ";
for (int x : lst) {
cout << x << " ";
}
cout << endl;
// 3. 反向遍历
cout << "反向遍历: ";
for (auto rit = lst.rbegin(); rit != lst.rend(); ++rit) {
cout << *rit << " ";
}
cout << endl;
// 4. 使用auto遍历(修改元素)
cout << "修改元素: ";
for (auto& x : lst) {
x *= 2;
}
for (int x : lst) cout << x << " ";
cout << endl;
return 0;
}6. 容量管理
cpp
#include <iostream>
#include <vector>
#include <list>
using namespace std;
int main() {
cout << "\n========== 6. 容量管理 ==========" << endl;
// ----- vector 容量管理 -----
cout << "\n--- vector 容量管理 ---" << endl;
vector<int> vec;
cout << "初始: size=" << vec.size()
<< ", capacity=" << vec.capacity() << endl;
// reserve: 预分配空间
vec.reserve(10);
cout << "reserve(10)后: capacity=" << vec.capacity() << endl;
// 添加元素观察容量增长
for (int i = 0; i < 15; i++) {
vec.push_back(i);
cout << "size=" << vec.size()
<< ", capacity=" << vec.capacity() << endl;
}
// shrink_to_fit: 释放多余内存
vec.shrink_to_fit();
cout << "shrink_to_fit后: capacity=" << vec.capacity() << endl;
// resize: 调整大小
vec.resize(5); // 缩小
cout << "resize(5)后: size=" << vec.size() << endl;
vec.resize(8, 100); // 扩大并用100填充
cout << "resize(8,100)后: ";
for (size_t i = 5; i < vec.size(); i++) {
cout << vec[i] << " ";
}
cout << endl;
// empty: 检查是否为空
cout << "vec为空? " << (vec.empty() ? "是" : "否") << endl;
// max_size: 最大可能大小
cout << "max_size: " << vec.max_size() << endl;
// ----- list 容量管理 -----
cout << "\n--- list 容量管理 ---" << endl;
list<int> lst;
cout << "初始: size=" << lst.size() << endl;
cout << "为空? " << (lst.empty() ? "是" : "否") << endl;
// list没有capacity()和reserve(),因为节点动态分配
lst.resize(5, 10);
cout << "resize(5,10)后: ";
for (int x : lst) cout << x << " ";
cout << " (size=" << lst.size() << ")" << endl;
lst.resize(3);
cout << "resize(3)后: ";
for (int x : lst) cout << x << " ";
cout << " (size=" << lst.size() << ")" << endl;
return 0;
}7. emplace 系列操作
cpp
#include <iostream>
#include <vector>
#include <list>
#include <string>
using namespace std;
// 辅助类用于观察构造过程
class Person {
public:
string name;
int age;
// 构造函数
Person(string n, int a) : name(n), age(a) {
cout << "构造: " << name << endl;
}
// 拷贝构造函数
Person(const Person& other) : name(other.name), age(other.age) {
cout << "拷贝: " << name << endl;
}
// 移动构造函数
Person(Person&& other) noexcept : name(move(other.name)), age(other.age) {
cout << "移动: " << name << endl;
}
// 析构函数
~Person() {
if (!name.empty()) {
cout << "析构: " << name << endl;
}
}
};
int main() {
cout << "\n========== 7. emplace 系列操作 ==========" << endl;
// ----- vector emplace_back vs push_back -----
cout << "\n--- vector emplace_back 对比 push_back ---" << endl;
vector<Person> vec1;
cout << "push_back: 先创建临时对象" << endl;
vec1.push_back(Person("Alice", 25));
cout << "\nemplace_back: 直接在容器中构造" << endl;
vector<Person> vec2;
vec2.emplace_back("Bob", 30); // 直接传递构造参数
// ----- emplace_back 返回引用 -----
cout << "\n--- emplace_back 返回引用 ---" << endl;
vector<Person> vec3;
Person& p = vec3.emplace_back("Charlie", 35);
p.age = 36; // 直接修改
cout << "修改后年龄: " << vec3[0].age << endl;
// ----- list emplace 系列 -----
cout << "\n--- list emplace 操作 ---" << endl;
list<Person> lst;
// emplace_back: 末尾构造
lst.emplace_back("David", 40);
// emplace_front: 开头构造
lst.emplace_front("Eve", 28);
// emplace: 指定位置构造
auto it = lst.begin();
advance(it, 1);
lst.emplace(it, "Frank", 32);
cout << "list 元素: ";
for (const auto& person : lst) {
cout << person.name << "(" << person.age << ") ";
}
cout << endl;
// ----- emplace 与 insert 对比 -----
cout << "\n--- emplace vs insert ---" << endl;
vector<pair<int, string>> vec_pair;
// insert: 需要先创建对象
vec_pair.insert(vec_pair.begin(), make_pair(1, "one"));
// emplace: 直接传递构造参数
vec_pair.emplace(vec_pair.begin(), 2, "two");
// emplace_back: 更简洁
vec_pair.emplace_back(3, "three");
cout << "vector<pair>: ";
for (const auto& p : vec_pair) {
cout << "(" << p.first << "," << p.second << ") ";
}
cout << endl;
// ----- emplace 在复杂容器中的使用 -----
cout << "\n--- emplace 高级用法 ---" << endl;
// 在 map 中使用
map<int, Person> personMap;
personMap.emplace(1, "Grace", 27); // 直接在map中构造
// 容器嵌套
vector<list<Person>> complexVec;
auto& innerList = complexVec.emplace_back(); // 构造空的list
innerList.emplace_back("Henry", 33);
return 0;
}8. 算法操作
cpp
#include <iostream>
#include <vector>
#include <list>
#include <algorithm>
#include <numeric>
using namespace std;
void printVector(const vector<int>& v, const string& msg) {
cout << msg << ": ";
for (int x : v) cout << x << " ";
cout << endl;
}
int main() {
cout << "\n========== 8. 算法操作 ==========" << endl;
vector<int> vec = {5, 2, 8, 1, 9, 3, 7, 4, 6};
printVector(vec, "原始数据");
// ----- 排序算法 -----
cout << "\n--- 排序算法 ---" << endl;
// sort: 排序(只适用于vector)
sort(vec.begin(), vec.end());
printVector(vec, "sort升序");
sort(vec.begin(), vec.end(), greater<int>());
printVector(vec, "sort降序");
// partial_sort: 部分排序
vector<int> vec2 = {5, 2, 8, 1, 9, 3, 7, 4, 6};
partial_sort(vec2.begin(), vec2.begin() + 4, vec2.end());
printVector(vec2, "partial_sort前4个");
// nth_element: 第n大的元素放对位置
vector<int> vec3 = {5, 2, 8, 1, 9, 3, 7, 4, 6};
nth_element(vec3.begin(), vec3.begin() + 4, vec3.end());
printVector(vec3, "nth_element(第5大的放对位置)");
// ----- 查找算法 -----
cout << "\n--- 查找算法 ---" << endl;
// find: 查找元素
auto it = find(vec.begin(), vec.end(), 5);
if (it != vec.end()) {
cout << "找到5,位置: " << distance(vec.begin(), it) << endl;
}
// binary_search: 二分查找(需要有序)
if (binary_search(vec.begin(), vec.end(), 5)) {
cout << "二分查找找到5" << endl;
}
// lower_bound/upper_bound: 边界查找
auto low = lower_bound(vec.begin(), vec.end(), 5);
auto up = upper_bound(vec.begin(), vec.end(), 5);
cout << "lower_bound(5): 位置" << distance(vec.begin(), low) << endl;
cout << "upper_bound(5): 位置" << distance(vec.begin(), up) << endl;
// ----- 修改算法 -----
cout << "\n--- 修改算法 ---" << endl;
// reverse: 反转
vector<int> vec4 = {1, 2, 3, 4, 5};
reverse(vec4.begin(), vec4.end());
printVector(vec4, "reverse反转");
// rotate: 旋转
rotate(vec4.begin(), vec4.begin() + 2, vec4.end());
printVector(vec4, "rotate左移2位");
// replace: 替换
replace(vec4.begin(), vec4.end(), 3, 99);
printVector(vec4, "replace(3->99)");
// fill: 填充
fill(vec4.begin(), vec4.end(), 0);
printVector(vec4, "fill(0)");
// ----- 删除算法 -----
cout << "\n--- 删除算法 ---" << endl;
vector<int> vec5 = {1, 2, 2, 3, 2, 4, 2, 5};
// remove: 逻辑删除(需要配合erase)
auto new_end = remove(vec5.begin(), vec5.end(), 2);
vec5.erase(new_end, vec5.end());
printVector(vec5, "remove+erase删除2");
// unique: 去重(需要配合erase)
vector<int> vec6 = {1, 1, 2, 2, 2, 3, 3, 4};
new_end = unique(vec6.begin(), vec6.end());
vec6.erase(new_end, vec6.end());
printVector(vec6, "unique+erase去重");
// ----- 数值算法 -----
cout << "\n--- 数值算法 ---" << endl;
vector<int> vec7 = {1, 2, 3, 4, 5};
// accumulate: 求和
int sum = accumulate(vec7.begin(), vec7.end(), 0);
cout << "sum = " << sum << endl;
// inner_product: 内积
vector<int> vec8 = {5, 4, 3, 2, 1};
int product = inner_product(vec7.begin(), vec7.end(), vec8.begin(), 0);
cout << "内积 = " << product << endl;
// partial_sum: 部分和
vector<int> result(vec7.size());
partial_sum(vec7.begin(), vec7.end(), result.begin());
printVector(result, "部分和");
// adjacent_difference: 相邻差
adjacent_difference(vec7.begin(), vec7.end(), result.begin());
printVector(result, "相邻差");
return 0;
}9. 实用示例
cpp
#include <iostream>
#include <vector>
#include <list>
#include <string>
#include <algorithm>
#include <random>
using namespace std;
// 学生类
class Student {
public:
string name;
int id;
double score;
Student(string n, int i, double s) : name(n), id(i), score(s) {}
void print() const {
cout << "[" << id << "] " << name << ": " << score;
}
};
// 游戏实体类
class GameObject {
public:
string type;
int x, y;
bool active;
GameObject(string t, int x, int y) : type(t), x(x), y(y), active(true) {}
void update() {
// 更新逻辑
}
};
int main() {
cout << "\n========== 9. 实用示例 ==========" << endl;
// ----- 示例1:学生成绩管理系统(使用vector)-----
cout << "\n--- 学生成绩管理系统 ---" << endl;
vector<Student> students;
// 添加学生
students.emplace_back("Alice", 1001, 85.5);
students.emplace_back("Bob", 1002, 92.0);
students.emplace_back("Charlie", 1003, 78.5);
students.emplace_back("David", 1004, 88.0);
students.emplace_back("Eve", 1005, 95.5);
// 按分数排序
sort(students.begin(), students.end(),
[](const Student& a, const Student& b) {
return a.score > b.score;
});
cout << "成绩排名:" << endl;
for (size_t i = 0; i < students.size(); i++) {
cout << i+1 << ". ";
students[i].print();
cout << endl;
}
// 查找特定分数段的学生
double threshold = 90.0;
auto it = find_if(students.begin(), students.end(),
[threshold](const Student& s) { return s.score >= threshold; });
cout << "\n90分以上的学生:" << endl;
while (it != students.end() && it->score >= threshold) {
cout << " ";
it->print();
cout << endl;
++it;
}
// 计算平均分
double avg = accumulate(students.begin(), students.end(), 0.0,
[](double sum, const Student& s) { return sum + s.score; })
/ students.size();
cout << "\n平均分: " << avg << endl;
// ----- 示例2:待办事项列表(使用list)-----
cout << "\n--- 待办事项列表 ---" << endl;
list<string> todoList = {
"完成报告",
"开会讨论",
"回复邮件",
"代码审查",
"更新文档"
};
cout << "今日待办:" << endl;
int num = 1;
for (const auto& task : todoList) {
cout << num++ << ". " << task << endl;
}
// 在中间插入紧急任务
auto taskIt = todoList.begin();
advance(taskIt, 2);
todoList.emplace(taskIt, "【紧急】修复线上bug");
// 完成任务后删除
taskIt = todoList.begin();
advance(taskIt, 1);
todoList.erase(taskIt); // 删除"开会讨论"
cout << "\n更新后的待办:" << endl;
num = 1;
for (const auto& task : todoList) {
cout << num++ << ". " << task << endl;
}
// ----- 示例3:游戏对象管理(混合使用)-----
cout << "\n--- 游戏对象管理 ---" << endl;
// 使用vector存储所有游戏对象(适合遍历更新)
vector<GameObject> gameObjects;
// 添加各种游戏对象
gameObjects.emplace_back("player", 10, 20);
gameObjects.emplace_back("enemy", 50, 30);
gameObjects.emplace_back("enemy", 60, 35);
gameObjects.emplace_back("item", 25, 15);
gameObjects.emplace_back("npc", 40, 25);
cout << "游戏对象数量: " << gameObjects.size() << endl;
// 批量更新所有对象
for (auto& obj : gameObjects) {
obj.update();
}
// 使用list存储活跃敌人(适合频繁删除)
list<GameObject*> activeEnemies;
for (auto& obj : gameObjects) {
if (obj.type == "enemy") {
activeEnemies.push_back(&obj);
}
}
cout << "活跃敌人数量: " << activeEnemies.size() << endl;
// 敌人被击败时从list中删除
auto enemyIt = activeEnemies.begin();
advance(enemyIt, 1); // 第二个敌人被击败
activeEnemies.erase(enemyIt);
cout << "击败一个敌人后剩余: " << activeEnemies.size() << endl;
// ----- 示例4:数据缓冲区(展示vector优势)-----
cout << "\n--- 数据缓冲区 ---" << endl;
vector<char> buffer;
buffer.reserve(1024); // 预分配1KB空间
// 模拟接收数据
for (int i = 0; i < 10; i++) {
buffer.push_back('A' + i);
}
cout << "缓冲区数据: ";
for (char c : buffer) cout << c;
cout << endl;
// 随机访问缓冲区数据
cout << "第5个字节: " << buffer[4] << endl;
// 清空缓冲区
buffer.clear();
cout << "清空后大小: " << buffer.size() << endl;
return 0;
}10. 性能对比
cpp
#include <iostream>
#include <vector>
#include <list>
#include <chrono>
#include <random>
using namespace std;
// 计时器类
class Timer {
private:
chrono::high_resolution_clock::time_point start;
string name;
public:
Timer(const string& n) : name(n) {
start = chrono::high_resolution_clock::now();
}
~Timer() {
auto end = chrono::high_resolution_clock::now();
auto duration = chrono::duration_cast<chrono::microseconds>(end - start);
cout << name << ": " << duration.count() << " μs" << endl;
}
};
int main() {
cout << "\n========== 10. 性能对比 ==========" << endl;
const int SIZE = 100000;
const int TESTS = 10000;
// ----- 1. 尾部插入性能 -----
cout << "\n--- 尾部插入性能 ---" << endl;
{
Timer t("vector push_back");
vector<int> vec;
vec.reserve(SIZE);
for (int i = 0; i < SIZE; i++) {
vec.push_back(i);
}
}
{
Timer t("list push_back");
list<int> lst;
for (int i = 0; i < SIZE; i++) {
lst.push_back(i);
}
}
// ----- 2. 头部插入性能 -----
cout << "\n--- 头部插入性能 ---" << endl;
{
Timer t("vector insert(begin)");
vector<int> vec;
for (int i = 0; i < TESTS; i++) {
vec.insert(vec.begin(), i);
}
}
{
Timer t("list push_front");
list<int> lst;
for (int i = 0; i < TESTS; i++) {
lst.push_front(i);
}
}
// ----- 3. 中间插入性能 -----
cout << "\n--- 中间插入性能 ---" << endl;
{
Timer t("vector insert(mid)");
vector<int> vec(SIZE, 0);
auto it = vec.begin() + SIZE/2;
for (int i = 0; i < TESTS; i++) {
vec.insert(it, i);
}
}
{
Timer t("list insert(mid)");
list<int> lst(SIZE, 0);
auto it = lst.begin();
advance(it, SIZE/2);
for (int i = 0; i < TESTS; i++) {
lst.insert(it, i);
}
}
// ----- 4. 随机访问性能 -----
cout << "\n--- 随机访问性能 ---" << endl;
vector<int> vec(SIZE);
list<int> lst(SIZE);
random_device rd;
mt19937 gen(rd());
uniform_int_distribution<> dis(0, SIZE-1);
{
Timer t("vector random access");
volatile int sum = 0;
for (int i = 0; i < TESTS; i++) {
sum += vec[dis(gen)];
}
}
{
Timer t("list random access");
volatile int sum = 0;
for (int i = 0; i < TESTS; i++) {
auto it = lst.begin();
advance(it, dis(gen));
sum += *it;
}
}
// ----- 5. 遍历性能 -----
cout << "\n--- 遍历性能 ---" << endl;
{
Timer t("vector iteration");
volatile int sum = 0;
for (int x : vec) {
sum += x;
}
}
{
Timer t("list iteration");
volatile int sum = 0;
for (int x : lst) {
sum += x;
}
}
// ----- 6. 排序性能 -----
cout << "\n--- 排序性能 ---" << endl;
vector<int> vec2(SIZE);
for (int i = 0; i < SIZE; i++) {
vec2[i] = rand();
}
list<int> lst2(vec2.begin(), vec2.end());
{
Timer t("vector sort");
sort(vec2.begin(), vec2.end());
}
{
Timer t("list sort");
lst2.sort();
}
return 0;
}11. 选择建议
cpp
#include <iostream>
#include <vector>
#include <list>
#include <string>
using namespace std;
// 决策树:根据使用场景选择容器
class ContainerSelector {
public:
static void recommend(const string& scenario) {
cout << "\n使用场景: " << scenario << endl;
cout << "推荐容器: ";
if (scenario.find("随机访问") != string::npos ||
scenario.find("排序") != string::npos ||
scenario.find("末尾操作") != string::npos) {
cout << "vector ✅" << endl;
cout << "原因: 随机访问O(1),排序高效,尾部插入快" << endl;
}
else if (scenario.find("中间插入") != string::npos ||
scenario.find("中间删除") != string::npos ||
scenario.find("频繁修改") != string::npos) {
cout << "list ✅" << endl;
cout << "原因: 中间插入删除O(1),迭代器不会失效" << endl;
}
else {
cout << "vector (默认选择)" << endl;
cout << "原因: 大多数情况下vector性能更好" << endl;
}
}
};
int main() {
cout << "\n========== 11. 选择建议 ==========" << endl;
// 场景1:需要频繁随机访问
ContainerSelector::recommend("需要频繁随机访问大量数据");
// 场景2:需要在中间频繁插入删除
ContainerSelector::recommend("需要在中间频繁插入和删除元素");
// 场景3:只需要在末尾操作
ContainerSelector::recommend("主要在末尾添加删除元素,需要排序");
// 场景4:不确定使用场景
ContainerSelector::recommend("不确定使用什么容器");
// ----- 总结表格 -----
cout << "\n--- 容器特性对比表 ---" << endl;
cout << "操作 | vector | list" << endl;
cout << "----------------|--------|------" << endl;
cout << "尾部插入 | O(1)* | O(1)" << endl;
cout << "头部插入 | O(n) | O(1)" << endl;
cout << "中间插入 | O(n) | O(1)" << endl;
cout << "随机访问 | O(1) | O(n)" << endl;
cout << "顺序遍历 | O(n) | O(n)" << endl;
cout << "排序 | O(nlogn)| O(nlogn)" << endl;
cout << "内存占用 | 连续 | 分散" << endl;
cout << "迭代器失效 | 会失效 | 不会失效" << endl;
cout << "\n* vector尾部插入均摊O(1),需要时可能重新分配" << endl;
return 0;
}这个整理保持了原有的节奏感,每个章节都有清晰的标题,代码示例完整且有注释,同时覆盖了你之前提到的所有知识点,包括 emplace 系列操作和 advance 等迭代器操作。