C++, STL容器 list:双向链表深度解析

请添加图片描述


一、链表本质与实现原理

1.1 数据结构特性

STL list是典型的双向链表实现,每个节点包含:

  • 数据域:存储实际元素
  • 前驱指针:指向前一个节点
  • 后继指针:指向后一个节点
// 节点结构伪代码
template <typename T>
struct __list_node {
   
    __list_node* prev;
    __list_node* next;
    T data;
};

1.2 内存布局图示

┌───────────┐    ┌───────────┐    ┌───────────┐
│  prev     │    │  prev     │    │  prev     │
├───────────┤    ├───────────┤    ├───────────┤
│  next     │ →→ │  next     │ →→ │  next     │
├───────────┤    ├───────────┤    ├───────────┤
│  data     │    │  data     │    │  data     │
└───────────┘    └───────────┘    └───────────┘

1.3 迭代器设计

双向链表迭代器是Bidirectional Iterator,支持++和–操作:

template <typename T>
struct __list_iterator {
   
    __list_node<T>* node;
    
    // 前置++操作
    __list_iterator& operator++() {
   
        node = node->next;
        return *this;
    }
    
    // 前置--操作
    __list_iterator& operator--() {
   
        node = node->prev;
        return *this;
    }
};

二、核心操作与使用技巧

2.1 基础操作示例

#include <list>

// 初始化方式
std::list<int> lst1 = {
   1, 3, 5};       // 初始化列表
std::list<std::string> lst2(10);       // 10个空字符串

// 高效插入操作
lst1.splice(lst1.end(), lst2);        // O(1)时间合并
lst2.insert(lst2.begin(), {
   "A", "B"});// 批量插入

// 特殊删除操作
lst1.remove_if([](int x){
    return x%2==0; }); // 条件删除

2.2 高级特性

节点转移操作(C++11+):

std::list<int> src = {
   1,2,3};
std::list<int> dst;

auto it = src.begin
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

智驾

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值