上海html5网站制作公司,Wordpress 免费收款插件,wordpress网站app,深圳外包网络推广C std::list 概念详解
std::list 是 C 标准模板库#xff08;STL#xff09;中的一个双向链表容器。与 vector 和 array 不同#xff0c;它不保证元素在内存中连续存储#xff0c;而是通过指针将各个元素连接起来。
核心特性
双向链表结构#xff1a;
每个元素包含指向前驱…C std::list 概念详解
std::list 是 C 标准模板库STL中的一个双向链表容器。与 vector 和 array 不同它不保证元素在内存中连续存储而是通过指针将各个元素连接起来。
核心特性
双向链表结构
每个元素包含指向前驱和后继的指针支持双向遍历前向和后向
时间复杂度
任意位置插入/删除O(1)随机访问O(n)效率低排序O(n log n)使用成员函数 sort()
内存特性
非连续内存分配每个元素有额外指针开销前驱 后继不会导致迭代器失效除被删除元素
迭代器类型
双向迭代器支持 和 --不支持随机访问不能 n常用成员函数操作函数示例插入元素push_back()list.push_back(10);push_front()list.push_front(5);insert()list.insert(it, 7);删除元素pop_back()list.pop_back();pop_front()list.pop_front();erase()list.erase(it);访问元素front()int first list.front()back()int last list.back()容量操作size()int len list.size()empty()if (list.empty()) ...特殊操作splice()list1.splice(pos, list2)sort()list.sort();merge()list1.merge(list2);reverse()list.reverse();
使用案例订单管理系统
#include iostream
#include list
#include string
#include algorithm// 订单结构
struct Order {int id;std::string customer;double amount;Order(int i, std::string c, double a) : id(i), customer(c), amount(a) {}
};int main() {// 创建订单链表std::listOrder orders;// 添加订单三种方式orders.push_back(Order(101, Alice, 150.0)); // 尾部添加orders.emplace_back(102, Bob, 99.99); // 直接构造C11orders.push_front(Order(100, VIP, 500.0)); // 头部添加// 在特定位置插入auto it orders.begin();std::advance(it, 2); // 移动到第三个位置orders.insert(it, Order(103, Charlie, 75.5));// 遍历并打印订单C11范围循环std::cout All Orders:\n;for (const auto order : orders) {std::cout ID: order.id , Customer: order.customer , Amount: $ order.amount \n;}// 删除特定订单金额100orders.remove_if([](const Order o) {return o.amount 100.0;});// 按金额升序排序orders.sort([](const Order a, const Order b) {return a.amount b.amount;});// 新订单批次std::listOrder newOrders {{201, David, 200.0},{202, Eva, 350.0}};// 合并订单到链表尾部orders.splice(orders.end(), newOrders);// 遍历打印最终订单std::cout \nFinal Orders (Sorted Merged):\n;for (const auto order : orders) {std::cout ID: order.id , Customer: order.customer , Amount: $ order.amount \n;}// 查找特定订单auto findIt std::find_if(orders.begin(), orders.end(), [](const Order o) { return o.customer Eva; });if (findIt ! orders.end()) {std::cout \nFound Evas order: $ findIt-amount \n;}return 0;
}输出示例
All Orders:
ID: 100, Customer: VIP, Amount: $500
ID: 101, Customer: Alice, Amount: $150
ID: 103, Customer: Charlie, Amount: $75.5
ID: 102, Customer: Bob, Amount: $99.99Final Orders (Sorted Merged):
ID: 103, Customer: Charlie, Amount: $75.5
ID: 102, Customer: Bob, Amount: $99.99
ID: 101, Customer: Alice, Amount: $150
ID: 201, Customer: David, Amount: $200
ID: 202, Customer: Eva, Amount: $350
ID: 100, Customer: VIP, Amount: $500Found Evas order: $350关键操作详解高效插入/删除
// 在任意位置插入O(1)
auto it orders.begin();
std::advance(it, 3);
orders.insert(it, Order(105, Frank, 120.0));// 删除指定位置元素O(1)
orders.erase(it);链表拼接
// 将list2的所有元素移动到list1的指定位置
list1.splice(position, list2);// 移动list2中的单个元素
list1.splice(pos, list2, elementIt);// 移动list2中的元素范围
list1.splice(pos, list2, startIt, endIt);专用排序算法
// 成员函数sort比std::sort更高效
orders.sort(); // 默认使用operator// 自定义排序
orders.sort([](const Order a, const Order b) {return a.amount b.amount; // 按金额降序
});链表合并
// 合并两个有序链表
list1.merge(list2);
// 注意合并后list2为空性能对比vs vector操作std::liststd::vector随机访问O(n)O(1)头部插入/删除O(1)O(n)尾部插入/删除O(1)O(1) 摊销中间插入O(1)O(n)内存连续性否是内存开销高指针低
最佳实践适用场景
需要频繁在任意位置插入/删除不需要随机访问需要稳定迭代器不失效需要高效合并/拆分操作不适用场景
需要随机访问元素内存受限环境需要缓存友好的操作现代C技巧
// 结构化绑定C17
for (const auto [id, customer, amount] : orders) {std::cout customer : $ amount \n;
}// 自定义内存分配器
std::listint, MyAllocator customList;经典应用场景
LRU缓存实现使用链表哈希表撤销/重做功能维护操作历史消息队列系统高效插入/删除图算法邻接表表示多线程任务池任务调度