STL之list学习笔记

本文深入解析了STL中list的内部实现原理,包括其环状双向链表结构、节点定义、迭代器操作以及核心成员函数如clear、push_front、push_back、erase等的工作机制。此外还介绍了高级操作如transfer、splice、remove、unique、merge等功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

参考SGI STL 及 侯捷《STL源码剖析》

stl list 源码下载——带注释

概述
STL的list是一个环状双向链表,链表尾端是一个空节点
list数据结构

list数据结构
list的节点使用prev指向前一个节点,next指向后一个节点,使用data来存数据
list节点结构
STL如下实现上述结构

//类似双向链表
struct _List_node_base {
  _List_node_base* _M_next;     //指向下一个节点
  _List_node_base* _M_prev;     //指向前一个节点
};

template <class _Tp>
struct _List_node : public _List_node_base {
  _Tp _M_data;              //存放数据
};

当list为空链表时,节点的prev和next均指向自己
list为空链表

_List_base(const allocator_type&) {
    _M_node = _M_get_node();
    _M_node->_M_next = _M_node;
    _M_node->_M_prev = _M_node;
  }

list的迭代器
list支持迭代器,其自增自减均是通过操作prev和next指针实现

  void _M_incr() { _M_node = _M_node->_M_next; }   //指向下一个节点
  void _M_decr() { _M_node = _M_node->_M_prev; }   //指向前一个节点

----------

//前置++
  _Self& operator++() { 
    this->_M_incr();
    return *this;
  }
  //后置++
  _Self operator++(int) { 
    _Self __tmp = *this;
    this->_M_incr();
    return __tmp;
  }
  //前置--
  _Self& operator--() { 
    this->_M_decr();
    return *this;
  }
  //后置--
  _Self operator--(int) { 
    _Self __tmp = *this;
    this->_M_decr();
    return __tmp;
  }

list的操作

  • clear
    通过从头开始遍历整个list,逐步将每个节点的数据destroy释放空间来完成整个链表的clear操作,最终恢复到空链表状态,即
    list为空链表

  • push_front、push_bavoid transfer(iterator __position, iterator __first, iterator __last)ck、erase、pop_front、pop_back
    通过调用迭代器的函数在相应位置完成链表的调整来实现

  • transfer、splice
    将[__first,__last)内的所有元素移动到__position之前,splice调用transfer函数
void transfer(iterator __position, iterator __first, iterator __last)
  • remove
//将值为__value的所有元素移除
template <class _Tp, class _Alloc>
void list<_Tp, _Alloc>::remove(const _Tp& __value)
  • unique
//移除数值相同的连续元素。注意,只有“连续而相同的元素”,才会被移除剩一个
template <class _Tp, class _Alloc>
void list<_Tp, _Alloc>::unique()
  • merge
//将__x合并到*this身上,两个lists的内容都必须先经过递增排序
template <class _Tp, class _Alloc>
void list<_Tp, _Alloc>::merge(list<_Tp, _Alloc>& __x)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值