C++ list容器基本逻辑结构和实现原理
C++初级语法
list 类模板
STL容器中以 带头双向循环链表 为核心的类模板- 类模板:
template<class T,class Alloc=allocator<T>> class list;- 这里
class T,表示用户可以用 任意类型 去通过类模板形成 想要的list<[具体类型]>类代码 - 这里
class Alloc=allocator<T>,表示用户可以根据 任意类型 去通过类模板 形成想要的 空间配置器,这里的空间配置器是提高申请类对象所需内存效率的->用户无需考虑该知识点
- 这里
list<[具体类型]>对象 本质是以带头双向循环链表为核心数据结构 的类对象,对应list<[具体类型]>对象 对应的头节点无任何意义,用户无法 删除、修改和控制 头节点- 因此为了了解
list对应的核心数据结构,我们需要了解list对象 和对应的ListNode节点对象 进行熟知此数据结构
- 因此为了了解
- 类模板:
- 使用
list类模板 需包含<list>头文件list是类模板名,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<[具体类型]>对应的迭代器对象不会因为扩容而出现迭代器失效问题
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()),通过n和val值去初始化当前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._node和position._node._prev中间插入一个包含val值的ListNode<[指定类型]>的节点对象.void insert (iterator position, size_type n, const value_type& val);,在position._node和position._node._prev中间插入n个包含val值的ListNode<[指定类型]>的节点对象.void insert (iterator position, InputIterator first, InputIterator last);,,在position._node和position._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中元素的排序,list是3倍慢
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<[具体类型]>对象的迭代器
G++下list<[具体类型]>的 迭代器设计 本质就是封装了指针的类模板,不同于顺序表为核心的STL容器的迭代器本质就是原生指针- 类模板:
template<class T,class Ref,class Ptr> class ListIterator;- 这里
T是list<[具体类型]>中的具体类型 - 这里
Ref是list<[具体类型]>中的具体类型& - 这里
Ptr是list<[具体类型]>中的具体类型*
- 这里
- 这里迭代器之所以是封装,是因为要运算符重载
++运算符,链表中节点指针 直接指针++是 无法在链表每一个 节点对象 进行跳转的,只有数组可以直接指针++,链表就需要运算符重载++让其满足再链表每一个节点跳转的动作
- 类模板:
迭代器类模板生成迭代器逻辑
list<[具体类型]>::iterator和list<[具体类型]>::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容器内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
C++命名空间using namespace std是什么意思
namespace中文意思是命名空间或者叫名字空间,传统的C++只有一个全局的namespace,下面这篇文章主要给大家介绍了关于C++命名空间using namespace std是什么意思的相关资料,需要的朋友可以参考下2023-01-01


最新评论