C 语言

关注公众号 jb51net

关闭
首页 > 软件编程 > C 语言 > C++ list容器

C++ list容器基本逻辑结构和实现原理

作者:Andy

本文详细介绍了C++中list容器的基本用法和实现原理,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧

C++初级语法

list 类模板

std::list<[具体类型]> [标识符],对应标识符下对象的底层逻辑

_head指向链表的ListNode头节点,用户通过list对象去控制整个链表的每个非头节点的ListNode节点
_size记录当前链表对象非头节点的个数

std::ListNode<[具体类型]> [标识符],对应标识符下对象的底层逻辑,用户所有核心操作和使用的都是ListNode节点对象 的地址来操控ListNode节点对象

本质是list<[具体类型]>这个链表对象 的ListNode<[具体类型]>节点对象
_next指向的节点为tail节点时,_next指向_head所指向的节点,不为tail节点时,则指向当前节点的下一个ListNode节点

//模拟list<int>逻辑图
                         _____________________
                        |list<int>            |
                        |ListNode<int>* _head;|
                        |size_t _size;        |:2
                        |________________|____|
 _______________                         |   _________________
|   ___________V_________________________V__|_____________    |
|  |ListNode<int>illicit                    |     int()   |   |
|  |ListNode<int>* _next;  ListNode<int>* _prev; int data;|   |
|  |________________|_____________________________________|   |
|                   |                        ^                |
|    _______________V________________________|_____________   |
|   |ListNode<int>                           |          3  |  |
|   |ListNode<int>* _next;  ListNode<int>* _prev; int data;|  |
|   |________________|_____________________________________|  |
|                    |                       ^                |
|    ________________V_______________________|______________  |
|   |ListNode<int>                           |          3   | |
|   |ListNode<int>* _next;  ListNode<int>* _prev; int data; | |
|   |________________|______________________________________| |
|____________________|                       ^________________|
//模拟list<string>逻辑图
                           __________________________
                          |list<int>                 |
                          |ListNode<string>* _head;  |
                          |__________________|_______|
                                             |
    _________________________________________V____________________________
   |ListNode<string>illicit                            string()           |
   |                                                   _________________  |     ____
   |ListNode<string>* _next;  ListNode<string>* _prev;|string           | |    |'\0'|
   |                     |                          | |char* _str;------|-|--->|____|
   |                     |                          | |size_t _size;    | | :0
   |                     |                          | |size_t _capacity;| | :1
   |                     |                          | |_________________| |
   |_____________________|__________________________|_____________________|
                         | ^                      ^ |
   ______________________V_|______________________|_V_____________________
   |ListNode<string>       |                      |    _________________  |     _________
   |ListNode<string>* _next;  ListNode<string>* _prev;|string           | |    |'\0'|    |
   |                                                  |char* _str;------|-|--->|____|____|
   |                                                  |size_t _size;    | | :0
   |                                                  |size_t _capacity;| | :1
   |                                                  |_________________| |
   |______________________________________________________________________|

list<[具体类型]>对应类模板 提供的构造

explict list(const allocator_type& alloc=allocator_type());list<[具体类型]>的默认构造,底层会开辟ListNode节点对象空间 作为当前list<[具体类型]>对象的头节点

ListNode()

std::list<int> l;
                  _____________________ :l
                 |list<int>            |
                 |ListNode<int>* _head;|
                 |________________|____|
                                  |       ____
                                  |      |    |
 _________________________________V______|____V________
|ListNode<int>illicit                    |        int()|
|ListNode<int>* _next;  ListNode<int>* _prev; int data;|
|________________|_____________________________________|
                 |    ^
                 |____|

explict list(size_type n,const value_type& val=value_type(),const allocator_type& alloc=allocator_type()),通过nval值去初始化当前list<[具体类型]>对象

std::list<int> l(2,3);
                         _____________________
                        |list<int>            |
                        |ListNode<int>* _head;|
                        |size_t _size;        |:2
                        |________________|____|
 _______________                         |   _________________
|   ___________V_________________________V__|_____________    |
|  |ListNode<int>illicit                    |     int()   |   |
|  |ListNode<int>* _next;  ListNode<int>* _prev; int data;|   |
|  |________________|_____________________________________|   |
|                   |                        ^                |
|    _______________V________________________|_____________   |
|   |ListNode<int>                           |          3  |  |
|   |ListNode<int>* _next;  ListNode<int>* _prev; int data;|  |
|   |________________|_____________________________________|  |
|                    |                       ^                |
|    ________________V_______________________|______________  |
|   |ListNode<int>                           |          3   | |
|   |ListNode<int>* _next;  ListNode<int>* _prev; int data; | |
|   |________________|______________________________________| |
|____________________|                       ^________________|

list(InputIterator first,InputIterator last,const allocator_type& alloc=allocator_type()),通过指定迭代器区间的连续数据去初始化当前链表对象(区间一般为链表对象的链表区间)

template<class InputIterator>

list(const list& x),深拷贝

list<[具体类型]>对应类模板 的 迭代器相关函数

iterator begin();,返回值对象 为指向 当前list对象对应头节点 的iterator类型 迭代器对象
const_iterator cbegin() const;,返回值对象 为指向 当前list对象对应头节点 的const_iterator类型 迭代器对象
iterator end();,返回值对象 为指向 当前list对象_head._next对应的节点 的iterator类型 迭代器对象
const_iterator cend() const;,返回值对象 为指向 当前list对象对应头节点 的const_iterator类型 迭代器对象

list<[具体类型]>对应类模板 的容量相关的成员函数

bool empty() const;,当list<[具体类型]>对应当前链表对象中非头节点个数为0则返回值为真,反之返回值为假.
size_type size() const;,返回值为list<[具体类型]>对应当前链表对象中 非头节点 个数.

本质就是返回对象为当前链表对象._size

list<[具体类型]>对应类模板提供的 节点数据操作 的成员函数

void assign (InputIterator first, InputIterator last);.

template <class InputIterator>

void assign (size_type n, const value_type& val);
void insert (iterator position, const value_type& val);,在position._nodeposition._node._prev中间插入一个包含val值的ListNode<[指定类型]>的节点对象.
void insert (iterator position, size_type n, const value_type& val);,在position._nodeposition._node._prev中间插入n个包含val值的ListNode<[指定类型]>的节点对象.
void insert (iterator position, InputIterator first, InputIterator last);,,在position._nodeposition._node._prev中间插入迭代器区间内所包含的所有ListNode<[指定类型]>节点对象.

template <class InputIterator>

void push_back (const value_type& val);,在list<[具体类型]>对应当前链表对象.end()指向的节点 前插入一个指定val值的ListNode<[指定类型]>节点
void push_front (const value_type& val);,在list<[具体类型]>对应当前链表对象.begin()指向的节点 前插入一个指定val值的ListNode<[指定类型]>节点
void pop_front();,删除list<[具体类型]>对应当前链表对象.begin()指向的节点.
void pop_back(),删除list<[具体类型]>对应当前链表对象.end()指向的节点 前对应的节点.
void resize (size_type n, value_type val = value_type());,调整_head对应链表已用节点的个数,更新完后满足_size=n.

_size<n可采用指定数据val来生成n-_size个节点
n<_size则直接删除多余的_size-n个节点即可

iterator erase (iterator position);,新建局部对象next=position._next,然后删除position._node指向的节点对象,返回值对象为next.
iterator erase (iterator first, iterator last);,新建局部对象next=last._next,然后删除迭代器区间所有的节点对象,返回值对象为next.
void clear();,delete 释放掉所有非头节点空间.
list<T>& operator=(list<T> lt),赋值重载(深拷贝)

list<[具体类型]>对应类模板提供的 链表节点操作 的成员函数

void splice (iterator position, list& x);,把 x 对象对应的所有非头节点 转移到指定迭代器对应空间 的位置之前,此时 x 对象变成空链表.

注意x对象不可以是当前链表对象

list<int> l1(2,3);
list<int> l2(1,5);
                         _____________________:l1                                          _____________________:l2
                        |list<int>            |                                           |list<int>            |
                        |ListNode<int>* _head;|                                           |ListNode<int>* _head;|
                        |size_t _size;   |    |:2                                         |size_t _size;   |    |:1
                        |________________|____|                                           |________________|____|
 _______________                         |   _________________     _______________                         |   _________________
|   ___________V_________________________V__|_____________    |   |   ___________V_________________________V__|_____________    |
|  |ListNode<int>illicit                    |     int()   |   |   |  |ListNode<int>illicit                    |     int()   |   |
|  |ListNode<int>* _next;  ListNode<int>* _prev; int data;|   |   |  |ListNode<int>* _next;  ListNode<int>* _prev; int data;|   |
|  |________________|_____________________________________|   |   |  |________________|_____________________________________|   |
|                   |                        ^                |   |                   |                        ^                |
|    _______________V________________________|_____________   |   |    _______________V________________________|_____________   |
|   |ListNode<int>                           |          3  |  |   |   |ListNode<int>                           |          5  |  |
|   |ListNode<int>* _next;  ListNode<int>* _prev; int data;|  |   |   |ListNode<int>* _next;  ListNode<int>* _prev; int data;|  |
|   |________________|_____________________________________|  |   |   |________________|_____________________________________|  |
|                    |                       ^                |   |____________________|                       ^________________|
|    ________________V_______________________|______________  |
|   |ListNode<int>                           |          3   | |
|   |ListNode<int>* _next;  ListNode<int>* _prev; int data; | |
|   |________________|______________________________________| |
|____________________|                       ^________________|

l1.splice(l1.end(),l2);

                         _____________________:l1                                         _____________________:l2
                        |list<int>            |                                          |list<int>            |
                        |ListNode<int>* _head;|                                          |ListNode<int>* _head;|
                        |size_t _size;        |:3                                        |size_t _size;        |:0
                        |________________|____|                                          |________________|____|
 _______________                         |   _________________    _______________                         |   _________________
|   ___________V_________________________V__|_____________    |  |   ___________V_________________________V__|_____________    |
|  |ListNode<int>illicit                    |     int()   |   |  |  |ListNode<int>illicit                    |     int()   |   |
|  |ListNode<int>* _next;  ListNode<int>* _prev; int data;|   |  |  |ListNode<int>* _next;  ListNode<int>* _prev; int data;|   |
|  |________________|_____________________________________|   |  |  |________________|_____________________________________|   |
|                   |                        ^                |  |___________________|                       ^_________________|
|    _______________V________________________|_____________   |
|   |ListNode<int>                           |          3  |  |
|   |ListNode<int>* _next;  ListNode<int>* _prev; int data;|  |
|   |________________|_____________________________________|  |
|                    |                       ^                |
|    ________________V_______________________|______________  |
|   |ListNode<int>                           |          3   | |
|   |ListNode<int>* _next;  ListNode<int>* _prev; int data; | |
|   |________________|_______________________|______________| |
|    ________________V_______________________|______________  |
|   |ListNode<int>                           |          5   | |
|   |ListNode<int>* _next;  ListNode<int>* _prev; int data; | |
|   |________________|______________________________________| |
|____________________|                       ^________________|

void splice (iterator position, list& x, iterator i);

注意x对象不可以是当前链表对象

void splice (iterator position, list& x, iterator first, iterator last);

注意x对象不可以是当前链表对象

void remove (const value_type& val);,根据提供的值找到并删除值.

list<int> l1;
l1.push_back(1);
l1.push_back(2);
                         _____________________
                        |list<int>            |
                        |ListNode<int>* _head;|
                        |size_t _size;        |:2
                        |________________|____|
 _______________                         |   _________________
|   ___________V_________________________V__|_____________    |
|  |ListNode<int>illicit                    |     int()   |   |
|  |ListNode<int>* _next;  ListNode<int>* _prev; int data;|   |
|  |________________|_____________________________________|   |
|                   |                        ^                |
|    _______________V________________________|_____________   |
|   |ListNode<int>                           |          1  |  |
|   |ListNode<int>* _next;  ListNode<int>* _prev; int data;|  |
|   |________________|_____________________________________|  |
|                    |                       ^                |
|    ________________V_______________________|______________  |
|   |ListNode<int>                           |          2   | |
|   |ListNode<int>* _next;  ListNode<int>* _prev; int data; | |
|   |________________|______________________________________| |
|____________________|                       ^________________|
l1.remove(2)
                         _____________________
                        |list<int>            |
                        |ListNode<int>* _head;|
                        |size_t _size;        |:2
                        |________________|____|
 _______________                         |   _________________
|   ___________V_________________________V__|_____________    |
|  |ListNode<int>illicit                    |     int()   |   |
|  |ListNode<int>* _next;  ListNode<int>* _prev; int data;|   |
|  |________________|_____________________________________|   |
|                   |                        ^                |
|    _______________V________________________|_____________   |
|   |ListNode<int>                           |          1  |  |
|   |ListNode<int>* _next;  ListNode<int>* _prev; int data;|  |
|   |________________|_____________________________________|  |
|____________________|                       ^________________|

void remove_if (Predicate pred);.

template <class Predicate>

void unique();,对应对象对应的链表必须有序才能执行此去重.

list<int> l1(2,3);
                         _____________________
                        |list<int>            |
                        |ListNode<int>* _head;|
                        |size_t _size;        |:2
                        |________________|____|
 _______________                         |   _________________
|   ___________V_________________________V__|_____________    |
|  |ListNode<int>illicit                    |     int()   |   |
|  |ListNode<int>* _next;  ListNode<int>* _prev; int data;|   |
|  |________________|_____________________________________|   |
|                   |                        ^                |
|    _______________V________________________|_____________   |
|   |ListNode<int>                           |          3  |  |
|   |ListNode<int>* _next;  ListNode<int>* _prev; int data;|  |
|   |________________|_____________________________________|  |
|                    |                       ^                |
|    ________________V_______________________|______________  |
|   |ListNode<int>                           |          3   | |
|   |ListNode<int>* _next;  ListNode<int>* _prev; int data; | |
|   |________________|______________________________________| |
|____________________|                       ^________________|
l1.unique();
                         _____________________
                        |list<int>            |
                        |ListNode<int>* _head;|
                        |size_t _size;        |:2
                        |________________|____|
 _______________                         |   _________________
|   ___________V_________________________V__|_____________    |
|  |ListNode<int>illicit                    |     int()   |   |
|  |ListNode<int>* _next;  ListNode<int>* _prev; int data;|   |
|  |________________|_____________________________________|   |
|                   |                        ^                |
|    _______________V________________________|_____________   |
|   |ListNode<int>                           |          3  |  |
|   |ListNode<int>* _next;  ListNode<int>* _prev; int data;|  |
|   |________________|_____________________________________|  |
|____________________|                       ^________________|

void unique (BinaryPredicate binary_pred);

template <class BinaryPredicate>

void merge (list& x);x链表对象当前链表对象的链表必须都是升序或者降序才可以被合并,合并后x对象的链表变为空链表.

注意x对象不可以是当前链表对象

list<int> l1(2,3);
list<int> l2(1,5);
                         _____________________:l1                                          _____________________:l2
                        |list<int>            |                                           |list<int>            |
                        |ListNode<int>* _head;|                                           |ListNode<int>* _head;|
                        |size_t _size;   |    |:2                                         |size_t _size;   |    |:2
                        |________________|____|                                           |________________|____|
 _______________                         |   _________________     _______________                         |   _________________
|   ___________V_________________________V__|_____________    |   |   ___________V_________________________V__|_____________    |
|  |ListNode<int>illicit                    |     int()   |   |   |  |ListNode<int>illicit                    |     int()   |   |
|  |ListNode<int>* _next;  ListNode<int>* _prev; int data;|   |   |  |ListNode<int>* _next;  ListNode<int>* _prev; int data;|   |
|  |________________|_____________________________________|   |   |  |________________|_____________________________________|   |
|                   |                        ^                |   |                   |                        ^                |
|    _______________V________________________|_____________   |   |    _______________V________________________|_____________   |
|   |ListNode<int>                           |          1  |  |   |   |ListNode<int>                           |          2  |  |
|   |ListNode<int>* _next;  ListNode<int>* _prev; int data;|  |   |   |ListNode<int>* _next;  ListNode<int>* _prev; int data;|  |
|   |________________|_____________________________________|  |   |   |________________|_____________________________________|  |
|                    |                       ^                |   |                    |                       ^                |
|    ________________V_______________________|______________  |   |    ________________V_______________________|______________  |
|   |ListNode<int>                           |          3   | |   |   |ListNode<int>                           |          4   | |
|   |ListNode<int>* _next;  ListNode<int>* _prev; int data; | |   |   |ListNode<int>* _next;  ListNode<int>* _prev; int data; | |
|   |________________|______________________________________| |   |   |________________|______________________________________| |
|____________________|                       ^________________|   |____________________|                       ^________________|

l1.merge(l2);

                         _____________________:l1                                          _____________________:l2
                        |list<int>            |                                           |list<int>            |
                        |ListNode<int>* _head;|                                           |ListNode<int>* _head;|
                        |size_t _size;        |:4                                         |size_t _size;   |    |:0
                        |________________|____|                                           |________________|____|
 _______________                         |   _________________     _______________                         |   _________________
|   ___________V_________________________V__|_____________    |   |   ___________V_________________________V__|_____________    |
|  |ListNode<int>illicit                    |     int()   |   |   |  |ListNode<int>illicit                    |     int()   |   |
|  |ListNode<int>* _next;  ListNode<int>* _prev; int data;|   |   |  |ListNode<int>* _next;  ListNode<int>* _prev; int data;|   |
|  |________________|_____________________________________|   |   |  |________________|_____________________________________|   |
|                   |                        ^                |   |___________________|                       ^_________________|
|    _______________V________________________|_____________   |
|   |ListNode<int>                           |          1  |  |
|   |ListNode<int>* _next;  ListNode<int>* _prev; int data;|  |
|   |________________|_____________________________________|  |
|                    |                       ^                |
|    ________________V_______________________|______________  |
|   |ListNode<int>                           |          2   | |
|   |ListNode<int>* _next;  ListNode<int>* _prev; int data; | |
|   |________________|______________________________________| |
|    _______________V________________________|_____________   |
|   |ListNode<int>                           |          3  |  |
|   |ListNode<int>* _next;  ListNode<int>* _prev; int data;|  |
|   |________________|_____________________________________|  |
|                    |                       ^                |
|    ________________V_______________________|______________  |
|   |ListNode<int>                           |          4   | |
|   |ListNode<int>* _next;  ListNode<int>* _prev; int data; | |
|   |________________|______________________________________| |
|____________________|                       ^________________|

void merge (list& x, Compare comp);,将链表 x 中的所有节点合并到当前链表中,合并后的链表保持升序排列,链表对象x变为空链表。

template <class Compare>
注意x对象不可以是当前链表对象

void sort();,排序(默认升序).

数据量大时,排序效率比较低

void sort (Compare comp);,按指定升降序对当前链表对象的链表节点进行排序

template <class Compare>
底层为归并排序,数据量大时,排序效率比较低,相比于vector中元素的排序,list3倍慢

void reverse();,逆置.

                         _____________________:l1
                        |list<int>            |
                        |ListNode<int>* _head;|
                        |size_t _size;        |:4
                        |________________|____|
 _______________                         |   _________________
|   ___________V_________________________V__|_____________    |
|  |ListNode<int>illicit                    |     int()   |   |
|  |ListNode<int>* _next;  ListNode<int>* _prev; int data;|   |
|  |________________|_____________________________________|   |
|                   |                        ^                |
|    _______________V________________________|_____________   |
|   |ListNode<int>                           |          1  |  |
|   |ListNode<int>* _next;  ListNode<int>* _prev; int data;|  |
|   |________________|_____________________________________|  |
|                    |                       ^                |
|    ________________V_______________________|______________  |
|   |ListNode<int>                           |          2   | |
|   |ListNode<int>* _next;  ListNode<int>* _prev; int data; | |
|   |________________|______________________________________| |
|    _______________V________________________|_____________   |
|   |ListNode<int>                           |          3  |  |
|   |ListNode<int>* _next;  ListNode<int>* _prev; int data;|  |
|   |________________|_____________________________________|  |
|                    |                       ^                |
|    ________________V_______________________|______________  |
|   |ListNode<int>                           |          4   | |
|   |ListNode<int>* _next;  ListNode<int>* _prev; int data; | |
|   |________________|______________________________________| |
|____________________|                       ^________________|

l1.reverse();
                         _____________________:l1
                        |list<int>            |
                        |ListNode<int>* _head;|
                        |size_t _size;        |:4
                        |________________|____|
 _______________                         |   _________________
|   ___________V_________________________V__|_____________    |
|  |ListNode<int>illicit                    |     int()   |   |
|  |ListNode<int>* _next;  ListNode<int>* _prev; int data;|   |
|  |________________|_____________________________________|   |
|                   |                        ^                |
|    _______________V________________________|_____________   |
|   |ListNode<int>                           |          4  |  |
|   |ListNode<int>* _next;  ListNode<int>* _prev; int data;|  |
|   |________________|_____________________________________|  |
|                    |                       ^                |
|    ________________V_______________________|______________  |
|   |ListNode<int>                           |          3   | |
|   |ListNode<int>* _next;  ListNode<int>* _prev; int data; | |
|   |________________|______________________________________| |
|    _______________V________________________|_____________   |
|   |ListNode<int>                           |          2  |  |
|   |ListNode<int>* _next;  ListNode<int>* _prev; int data;|  |
|   |________________|_____________________________________|  |
|                    |                       ^                |
|    ________________V_______________________|______________  |
|   |ListNode<int>                           |          1   | |
|   |ListNode<int>* _next;  ListNode<int>* _prev; int data; | |
|   |________________|______________________________________| |
|____________________|                       ^________________|

仿函数

list<[具体类型]>对象的迭代器

迭代器类模板生成迭代器逻辑

list<[具体类型]>::iteratorlist<[具体类型]>::const_iterator本质是基于一个ListIterator类模板所生成的两个不同的类
list<[具体类型]>::iterator,本质是ListIterator<[具体类型],[具体类型]&,[具体类型]*>list为了让迭代器统一命名就在list内部进行typedef ListIterator<T,T&,T*> iterator重命名
list<[具体类型]>::const_iterator,本质是ListIterator<[具体类型],const [具体类型]&,const [具体类型]*>list为了让迭代器统一命名就在list内部进行typedef ListIterator<T,T&,T*> const_iterator重命名

   :类模板                                                                                              :类
   _______________________________________                          ____________________________________:list<[具体类型]>::iterator
  |ListIterator<T,Ref,Self>               |                        |ListIterator<T,T&,T*>               |
  |ListNode<T> _node;                     |                        |ListNode<T> _node;                  |
  |ListIterator<T,Ref,Self> operator++(); |-----Ref=T&; Self=T*;-->|ListIterator<T,T&,T*> operator++(); |
  |ListIterator<T,Ref,Self> operator--(); |                        |ListIterator<T,T&,T*> operator--(); |
  |T& operator*();                        |                        |T& operator*();                     |
  |_______________________________________|                        |____________________________________|
      |
    Ref=const T&
    Self=const T*
      |
      |                                 :类
 _____V_________________________________:list<[具体类型]>::const_iterator
|ListIterator<T,const T&,const T*>      |
|ListNode<T> _node;                     |
|ListIterator<T,Ref,Self> operator++(); |
|ListIterator<T,Ref,Self> operator--(); |
|T& operator*();                        |
|_______________________________________|

list<[具体类型]>对象的非 const 迭代器

std::list<int> sl(1,3);
                         _____________________
                        |list<int>            |
                        |ListNode<int>* _head;|
                        |________________|____|
                                         |                        _________________________________________  :sl.end()
    _____________________________________V________________       |ListIterator<int>                        |
   |ListNode<int>illicit                           int()  |<-----|-ListNode<int>* _node                    |
   |ListNode<int>* _next;  ListNode<int>* _prev; int data;|      |ListIterator<int,int&,int*> operator++();|
   |________________|_________________________|___________|      |ListIterator<int,int&,int*> operator--();|
                    | ^                     ^ |                  |int& operator*();                        |
                    | |                     | |                  |_________________________________________|
    ________________V_|_____________________|_V___________        _________________________________________  :sl.begin()
   |ListNode<int>     |                     |         3   |      |ListIterator<int>                        |
   |ListNode<int>* _next;  ListNode<int>* _prev; int data;|<-----|-ListNode<int>* _node                    |
   |______________________________________________________|      |ListIterator<int,int&,int*> operator++();|
                                                                 |ListIterator<int,int&,int*> operator--();|
                                                                 |int& operator*();                        |
                                                                 |_________________________________________|

list<[具体类型]>对象的 const 迭代器

const [类型] [标识符],因为[标识符]被const保护,因此只要通过该[标识符] 合法得到的地址或者成员变量的标识符,这个地址成员变量的标识符就天然的就被const修饰
list<[具体类型]>::const_iterator就是list<[具体类型]>const迭代器,这里list<[具体类型]>::const_iterator本质就是ListConstIterator<[具体类型]>

这里list<[具体类型]>::const_iterator不是const ListIterator<[具体类型]>,是因为const ListIterator<[具体类型]>const修饰的是_node这个成员变量标识符,而我们要const修饰*_node这个标识符,因此我们需要新的迭代器类 让其内部是const修饰的是*_node这个标识符才可以

const std::list<int> sl(1,3);
 _____________________________________________________________
|const sl                 _____________________               |
|                        |list<int>            |              |
|                        |ListNode<int>* _head;|              |
|                        |________________|____|              |
|-----------------------------------------|-------------------|    _____________________________________________________  :sl.cend()
|code read-only protected                 |                   |   |code protected the pointed resource                  |
|    _____________________________________V________________   |   |ListIterator<int,const int&,const int*>              |
|   |ListNode<int>illicit                           int()  |<-|---|-ListNode<int>* _node                                |
|   |ListNode<int>* _next;  ListNode<int>* _prev; int data;|  |   |ListIterator<int,const int&,const int*> operator++();|
|   |________________|_________________________|___________|  |   |ListIterator<int,const int&,const int*> operator--();|
|                    | ^                     ^ |              |   |const int& operator*();                              |
|                    | |                     | |              |   |_____________________________________________________|
|    ________________V_|_____________________|_V___________   |    _____________________________________________________  :sl.cbegin()
|   |ListNode<int>     |                     |         3   |  |   |code protected the pointed resource                  |
|   |ListNode<int>* _next;  ListNode<int>* _prev; int data;|  |   |ListIterator<int,const int&,const int*>              |
|   |                                                    ^ |<-|---|-ListNode<int>* _node                                |
|   |____________________________________________________|_|  |   |ListIterator<int,const int&,const int*> operator++();|
|                                                        |    |   |ListIterator<int,const int&,const int*> operator--();|
|                                                        |    |   |const int& operator*();                              |
|                                                        |    |   |const int* operator->();                             |
|________________________________________________________|____|   |________________|____________________________________|
                                                         |_________________________|

ListIterator& operator++()前置++当前迭代器进行更新,迭代器去指向的当前节点 的下一个节点,返回值对象 为当前更新好的迭代器对象
ListIterator operator++(int),创建局部迭代器对象tmp=当前迭代器对象,然后当前迭代器进行更新,迭代器去指向的当前节点 的下一个节点,返回值对象 为tmp.
ListIterator& operator--()前置--当前迭代器对象进行更新,迭代器去指向的当前节点 的上一个节点,返回值对象 为当前更新好的迭代器对象
ListIterator operator--(int),创建局部迭代器对象tmp=当前迭代器对象,然后当前迭代器进行更新,迭代器去指向的当前节点 的上一个节点,返回值对象 为tmp.
T& operator*(),返回值对象 为当前迭代器对象 所指向节点的data变量.
bool operator==(const ListIterator& it),当前迭代器对象指向的节点是否和it指向的节点是同一个,是返回真,反之返回假
bool operator!=(const ListIterator& it),当前迭代器对象指向的节点是否和it指向的节点是同一个,是返回假,反之返回真
T* operator->(),返回值为 当前迭代器的成员变量所指向的节点 的 特定成员变量的地址

std::list<int> sl(2,3);
                         _____________________
                        |list<int>            |
                        |ListNode<int>* _head;|
                        |________________|____|
                                         |
    _____________________________________V________________
   |ListNode<int>illicit                           int()  |
   |ListNode<int>* _next;  ListNode<int>* _prev; int data;|
   |________________|_________________________|___________|
                    | ^                     ^ |
                    | |                     | |
    ________________V_|_____________________|_V___________        ____________________________________________  :sl.begin()
   |ListNode<int>     |                     |         3   |      |ListIterator<int>                           |
   |ListNode<int>* _next;  ListNode<int>* _prev; int data;|<-----|-ListNode* _node                            |
   |                                                   ^  |      |                                            |
   |___________________________________________________|__|      |ListIterator<int,int&,int*> operator--();   |
                                                       |         |int& operator*();                           |
                                                       |         |ListIterator<int,int&,int*> operator++();   |
                                                       |         |int* operator->();                          |
                                                       |         |__________|_________________________________|
                                                       |____________________|

到此这篇关于C++ list容器基本逻辑结构详解的文章就介绍到这了,更多相关C++ list容器内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文