2026/4/18 18:14:05
网站建设
项目流程
家乡ppt模板免费下载网站,做网站的有哪些学校,数字经济发展情况报告,怎样进入公众号平台登录一、数据结构说明
list
std::list 是一种双向链表#xff08;doubly linked list#xff09;#xff0c;其底层数据结构是互不连续的节点。
刷题要点#xff1a;
在任何位置进行元素的插入和删除都非常高效#xff0c;时间复杂度为 O(1)。不支持随机访问#xff08;如 li…一、数据结构说明liststd::list是一种双向链表doubly linked list其底层数据结构是互不连续的节点。刷题要点在任何位置进行元素的插入和删除都非常高效时间复杂度为 O(1)。不支持随机访问如list[i]只能通过迭代器顺序访问访问第 N 个元素时间复杂度为 O(N)。在需要频繁在序列中间进行增删操作且不需要随机访问的场景下list比vector或deque更具优势。二、常见使用方法std::list核心使用#include list #include algorithm // 部分操作可能需要但list有自带的sort // 常见构造 std::listint l; // 空 list std::listint l3 {1,2,3,4}; // 列表初始化 // 查看属性 l.size(); // 元素个数O(N) (可能视具体实现) l.empty(); // 是否为空O(1) // 注意list 没有 capacity() 接口因为是链表结构按需分配。 // 改变大小 l.resize(n); // 改变 size变大时填充默认值变小时移除多余元素。 l.clear(); // 清空所有元素。 // 元素增删改查 l.push_back(x); // 尾部添加O(1) l.pop_back(); // 删除尾部元素O(1) l.push_front(x); // 头部添加O(1) l.pop_front(); // 头部删除O(1) l.insert(it, x); // 在迭代器 it 位置插入O(1) l.erase(it); // 擦除 it返回下一个元素迭代器O(1) // 遍历 // list 不支持随机访问只能用迭代器或范围for循环 for (const auto x : l) { /* ... */ } for (auto it l.begin(); it ! l.end(); it) { /* ... */ }std::list特殊操作// 排序 l.sort(); // 默认升序list自带的排序方法O(N log N) l.sort(std::greaterint()); // 降序 // 合并与拼接 l.merge(other_list); // 将 other_list 合并到当前 list (要求两者都已排序)other_list 变空。 l.splice(it, other_list); // 将 other_list 的所有元素移动到当前 list 的 it 位置other_list 变空。 // 移除 l.remove(value); // 移除所有值为 value 的元素。 l.remove_if(predicate); // 移除所有满足 predicate 条件的元素。 l.unique(); // 移除连续重复的元素list 必须已排序。 l.reverse(); // 反转 list。三、底层实现liststd::list的底层是一个双向循环链表。每个节点包含数据、指向前一个节点的指针和指向后一个节点的指针。通常会有一个“哨兵节点”伪头节点来简化边界处理。插入和删除仅需修改少量指针时间复杂度为 O(1)。随机访问不支持 O(1)需 O(N) 遍历。内存开销每个节点额外的指针存储导致内存占用高于std::vector。迭代器稳定性插入和删除元素时除了被删除元素的迭代器其他迭代器保持有效。四、注意事项选择依据std::list最适用于需要频繁在序列中间进行插入和删除但不要求随机访问的场景。如果涉及大量随机访问或内存连续性有要求应优先考虑std::vector或std::deque。排序由于不支持随机访问迭代器std::list不能使用std::sort而必须使用其自带的sort()成员函数。内存和性能尽管插入删除快但由于内存不连续list的遍历可能比vector慢且每个元素占用更多内存。迭代器失效list的迭代器在插入和删除操作时相对稳定但为了代码清晰和避免潜在问题建议在操作后更新相关迭代器。使用场景需要频繁在数据结构中进行插入删除或者合并操作同时不需要排序或者在插入的时候已经有序。又或者是不确定数据的大小或者内存碎片较多的场景这种刷题的时候不考虑内存问题大部分都是时间不够例如基数排序中的每个桶中的元素不过一般vector也能实现而且效果更好就是了。