C++ STL list容器详解与实战

C++ STL list 容器详解

一、基本特性
  1. 双向链表结构
    std::list 是双向链表的模板类实现,每个节点包含数据域和指向前后节点的指针:
    struct ListNode {
        T data;
        ListNode* prev;
        ListNode* next;
    };
    

  2. 时间复杂度
    • 插入/删除:$O(1)$(已知迭代器位置)
    • 随机访问:$O(n)$
    • 排序:$O(n \log n)$(成员函数 sort()

二、核心操作
1. 初始化
#include <list>
std::list<int> lst1;                  // 空链表
std::list<int> lst2(5, 10);           // 5个值为10的元素
std::list<int> lst3(lst2.begin(), lst2.end()); // 范围构造

2. 元素操作
lst.push_front(1);                    // 头部插入
lst.push_back(2);                     // 尾部插入
lst.insert(itr, 3);                   // 指定位置插入
lst.pop_front();                      // 头部删除
lst.erase(itr);                       // 删除迭代器指向元素
lst.remove(10);                       // 删除所有值为10的元素

3. 迭代器
for (auto itr = lst.begin(); itr != lst.end(); ++itr) {
    std::cout << *itr << " ";
}


三、模拟实现关键点
1. 节点结构
template <typename T>
struct __list_node {
    T data;
    __list_node* prev;
    __list_node* next;
};

2. 迭代器封装
template <typename T>
struct __list_iterator {
    __list_node<T>* ptr;

    // 重载运算符
    T& operator*() { return ptr->data; }
    __list_iterator& operator++() { 
        ptr = ptr->next; 
        return *this;
    }
};

3. 核心接口实现
template <typename T>
class my_list {
private:
    __list_node<T>* __head; // 哨兵节点
public:
    void push_back(const T& val) {
        __list_node<T>* new_node = new __list_node<T>{val, __head->prev, __head};
        __head->prev->next = new_node;
        __head->prev = new_node;
    }

    iterator begin() { 
        return iterator(__head->next); 
    }
};


四、典型应用场景
  1. 频繁插入删除
    例如游戏中的动态对象管理:
    std::list<GameObject> obj_list;
    obj_list.erase(obj_list.begin()); // 快速移除首元素
    
  2. 大元素存储
    避免 vector 扩容时的拷贝开销:
    std::list<LargeData> data_chain;
    

五、性能对比
操作std::vectorstd::list
随机访问$O(1)$$O(n)$
头部插入$O(n)$$O(1)$
中间插入$O(n)$$O(1)$
局部排序低效高效(splice

提示:优先选择 std::list 的场景:

  • 元素大小超过缓存行(通常 > 64字节)
  • 需要高频在任意位置插入/删除
  • 需要稳定迭代器(无失效问题)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值