顺德区建设局网站做跳转链接到自己的网站
web/
2025/10/3 1:40:53/
文章来源:
顺德区建设局网站,做跳转链接到自己的网站,wordpress ping服务列表,网站的开发方法一、成员变量及其基本结构
1.基本结构模型
本质是一个带头双向循环列表#xff0c;将节点进行封装#xff0c;并且为了方便使用#xff0c;进行重定义 2.节点的封装定义 templateclass T//定义节点struct list_node{list_nodeT* _prev;list_nodeT…一、成员变量及其基本结构
1.基本结构模型
本质是一个带头双向循环列表将节点进行封装并且为了方便使用进行重定义 2.节点的封装定义 templateclass T//定义节点struct list_node{list_nodeT* _prev;list_nodeT* _next;T _data;list_node(const T x T()) :_prev(nullptr),_next(nullptr),_data(x){}};
在定义节点时要注意将初始化一起进行封装完成提供默认构造函数
3.成员变量的定义
成员变量是一个哨兵位的头结点
typedef list_nodeT node;//对节点重命名方便使用
private:list_nodeT* _head; 二、迭代器重点
1.介绍
list的迭代器用原生指针无法实现需要对原生指针进行封装然后对顺序表指针的行为操作进行模拟实现是list模拟实现中最大的重点难点此时从使用者的角度上看依然能将iterator看作为指针去使用但设计者的角度上看其本质是一个指针的封装是个自定义类型。
2.对指针的基本封装
templateclass T
struct __list_iterator
{typedef list_nodeint node;//将节点重定义方便使用typedef __list_iteratorint self;//将类型重定义方便使用//成员变量node* _node;//初始化__list_iterator(node* n):_node(n){}//模拟实现指针操作...
}
以上对节点指针进行了封装处理之后逐一实现常用的功能例如 、--、* 、 - 、 、! 等等
3.和--
要提供迭代器和--的操作需要对运算符进行重载链表迭代器的本质上是获得下一个节点的地址--则是前一个节点的地址并且要区分前置和后置 //slef operator(){_node _node-_next;return *this;}slef operator(int)//后置{slef tmp(*this);_node _node- _next;return tmp;}//--self operator--(){_node _node-_prev;return *this;}self operator--(int){self tmp(*this);_node _node-_prev;return tmp;}
4. 和 !
迭代器的比较本质是要比较其封装在内部的指针是否同一个
bool operator!(const self n)
{return _node ! n._node;
}bool operator(const self n)
{return _node n._node;
}
5. * 和 -
对解引用操作符的重载则需要考虑到常量迭代器的调用常量迭代器去本质是对迭代器所指向的内容进行常量化因此在这里const_iterator 和 iterator 的核心区别在于解引用后返回的值是否常量其他功能相同因此可以使用类模板去控制这两个运算符重载返回值的区别在定义部分加上两个新的模板参数即可。
templateclass T,class Ref,class Ptr
strucr __list_iterator
{...//定义和重命名等等Ref operator*()// Ref T迭代器 / const T常量迭代器{return _node-_data;}//对于-的重载存在特殊处理只需要返回Ptr operator-()// Ptr T*迭代器/ const T*常量迭代器{return _node-_data;}
}// 迭代器定义部分在list类内定义
// typedef __list_iteratorT,T,T* iterator;
// typedef __list_con_iteratorT,const T,const T*; 三、构造与析构
1.默认构造函数
默认构造需要初始化出一个哨兵位的头结点并且让节点指针指向自己为了方便其他构造函数初始化哨兵位的头结点可以单独写一个函数进行复用 void empty_init(){_head new node;_head-_next _head;_head-_prev _head;}list()//直接的初始化{empty_init();}
2.用迭代器区间去构造
迭代器区间构造需要借助函数模板任意类型的迭代器都可以将值拷贝到容器中
templateclass Iterator
list(Iterator first,Iterator last)
{//先得初始化容器empty_init();while(first ! last){push_back(*first); // 底层是first;}
}
3.拷贝构造
拷贝构造这里选择对上面的构造函数进行复用深拷贝出一个tmp在进行交换 void swap(listT lt){std::swap(_head, lt._head);}list(const listT lt)//拷贝构造{empty_init();listT tmp(lt.begin(), lt.end());swap(tmp);}
4.赋值重载
赋值重载的底层实现也是在传参的时候调用了拷贝构造实现深拷贝后在进行交换 listT operator(listT lt)//赋值重载{swap(lt);return *this;}
5.析构函数
可以先实现clear然后复用底层就是将所有节点全部逐一释放用迭代器遍历释放即可 void clear(){iterator it begin();while (it ! end()){it erase(it);}}~list()//析构{clear();delete _head;_head nullptr;}四、增删操作
对应增删操作只需要实现insert和erase其余的头插头删等等都可以对其进行复用这里是用迭代器去实现的。 void insert(iterator pos, const T x){node* cur pos._node;node* prev cur-_prev;node* new_node new node(x);//链接new_node-_prev prev;prev-_next new_node;new_node-_next cur;cur-_prev new_node;}iterator erase(iterator pos){assert(pos ! end());node* cur pos._node;node* prev cur-_prev;node* next cur-_next;delete cur;//链接prev-_next next;next-_prev prev;return iterator(next);}
需要注意的是erase后迭代器会失效因此为了部分场景下的方便erase是有一个返回值的返回的是下一个节点的迭代器 总结
本章通过自行模拟实现了list加深了类和对象以及list的相关知识其中很重要的一个知识点就是对与list迭代器的封装和实现本篇博客整理了整个实现过程的思路方便今后复习和其他同学参考学习
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/85940.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!