- 前言
- 节点模板、迭代器模板
- list模板
- 容器的交换
- 迭代器:单向,双向,随机,const
- G。
- 本质:双向带头循环链表
注释到家了
- 实现list(双向带头循环链表)模板需要:
- 单个节点的类模板,包含成员变量的声明,和初始化
- 迭代器模板:成为单个节点类型的指针;成员变量的声明,初始化;成员函数++、!=、*迭代器类型对象
- clear清理到只剩最后一个头节点即可。
namespace mylist
{
---------------节点模板--------------------------------
/单个节点类模板 T..char ,int
template
struct _list_node / 类名
{
/ 类型 _list_node
_list_node* _next;
_list_node* _prev;
T _data; /数据
/单个节点类的构造函数 单个节点的初始化
_list_node(const T& x = T())
:_next(nullptr)
, _prev(nullptr)
, _data(x)
};
------------------------------迭代器模板-----------------------------
/ 让我迭代器称为你这个类型的指针
/ 类型包含内置类型int,char等,还包含自定义类型
/_list_node 是类名,_list_node才是自定义类型
/指针封装一下:i am iterator 类,实例化出来是迭代器对象
template
struct _list_itreator
{
/对节点类型 重命名
typedef _list_node Node;
/成员变量
Node* _node; /该节点类型的一个指针
/迭代器的构造函数,用单个节点类型的指针初始化
_list_itreator(Node* _node)
:_node(node)
{} / 一个迭代器就是一个节点的指针
/*我迭代器, 为什么要*我,因为我是节点类型的指针
/想要拿到我迭代器的数据
T& operator*()
{
return _node->_data;
}
/ ++it 拿到下一个位置的迭代器
_list_itreator& operator++()
{
_node = _node->_next;
return *this; //this是迭代器的地址
}
/_list_itreator it1,it2
/ 迭代器 !=,等于成员变量是否相等
bool operator!=(const _list_itreator& it)
{
return _node != it._node;
}
};
......
......
}
list模板
放弃了,自己的迭代器区间构造用不了,const的也用不了,,有浏览的同学可以看看这个
某位大佬的超链接
- 用容器内部的成员函数 .sawp(),交换的是头指针的值。
- 库里面的是深拷贝,申请内存,效率太慢
- strcut 成员默认公有
单向:只能++,不能–;链表
双向:可以++,也可以–;双向链表,map
随机:可以++,可以–,可以+,可以-;底层是数祖的,string/vector/deque/map
迭代器的本质是内置类型的指针拷贝构造和赋值重载会完成值浅拷贝。
迭代器是算法和容器之间的胶合剂,对让算法对所有容器都有统一的访问方式。
| 随机的也是双向 |
|---|
| const迭代器库函数底层解决方案,通过增加模板参数实现不同的返回值类型 |
|---|



