做一个能注册用户的网站,视频模板网站,装饰行业网站模板,创建一个网站的步骤是目录 1、前言
2、List.h
3、Test.cpp 1、前言
1. 简单实现std::list#xff0c;重点#xff1a;迭代器#xff0c;类模板#xff0c;运算符重载。
2. 并不是#xff0c;所有的类#xff0c;都需要深拷贝#xff0c;像迭代器类模板#xff0c;只是用别的类的资源重点迭代器类模板运算符重载。
2. 并不是所有的类都需要深拷贝像迭代器类模板只是用别的类的资源不需要深拷贝。
3. 高度相似 - 模板。
4. 迭代器的种类
按功能iteratorreverse_iteratorconst_iteratorconst_reverse_iterator。
按结构(性质)决定可以使用什么算法
单向(Forward)forward_list/unordered_map/unordered_set
双向(Bidirectional)list/map/set /--
随机(Random Access)vector/string/deque /--//-
2、List.h
#pragma once#include iostream
#include list
#include assert.husing namespace std;namespace Lzc
{templateclass Tstruct list_node{typedef list_nodeT Node;T _data;Node* _next;Node* _prev;list_node(const T data T()):_data(data), _next(nullptr), _prev(nullptr){}};//templateclass T//struct list_iterator//{// typedef list_nodeT Node;// typedef list_iteratorT iterator;// Node* _node;// list_iterator(Node* node)// :_node(node)// {}// T operator*() const// {// return _node-_data;// }// T* operator-() const// {// return _node-_data;// }// iterator operator() // 前置// {// _node _node-_next;// return *this;// }// iterator operator(int) // 后置// {// iterator tmp(_node);// _node _node-_next;// return tmp;// }// iterator operator--() // 前置--// {// _node _node-_prev;// return *this;// }// iterator operator--(int) // 后置--// {// iterator tmp(_node);// _node _node-_prev;// return tmp;// }// bool operator!(const iterator it) const// {// return _node ! it._node;// }// bool operator(const iterator it) const// {// return _node it._node;// }//};//templateclass T//struct list_const_iterator//{// typedef list_nodeT Node;// typedef list_const_iteratorT const_iterator;// Node* _node;// list_const_iterator(Node* node)// :_node(node)// {// }// const T operator*() const// {// return _node-_data;// }// const T* operator-() const// {// return _node-_data;// }// const_iterator operator() // 前置// {// _node _node-_next;// return *this;// }// const_iterator operator(int) // 后置// {// iterator tmp(_node);// _node _node-_next;// return tmp;// }// const_iterator operator--() // 前置--// {// _node _node-_prev;// return *this;// }// const_iterator operator--(int) // 后置--// {// iterator tmp(_node);// _node _node-_prev;// return tmp;// }// bool operator!(const const_iterator it) const// {// return _node ! it._node;// }// bool operator(const const_iterator it) const// {// return _node it._node;// }//};// 高度相似-模板templateclass T, class Ref, class Ptrstruct list_iterator{typedef list_nodeT Node;typedef list_iteratorT, Ref, Ptr Self;Node* _node;list_iterator(Node* node) // 就是要指针浅拷贝没问题:_node(node){}Ref operator*() const{return _node-_data;}Ptr operator-() const{return _node-_data;}Self operator() // 前置{_node _node-_next;return *this;}Self operator(int) // 后置{Self tmp(_node);_node _node-_next;return tmp;}Self operator--() // 前置--{_node _node-_prev;return *this;}Self operator--(int) // 后置--{Self tmp(_node);_node _node-_prev;return tmp;}bool operator!(const Self it) const{return _node ! it._node;}bool operator(const Self it) const{return _node it._node;}};templateclass Tclass list{typedef list_nodeT Node; // 只有list类的成员函数或者友元才能使用这个类型别名public:typedef list_iteratorT, T, T* iterator;typedef list_iteratorT, const T, const T* const_iterator;//typedef list_iteratorT iterator;//typedef list_const_iteratorT const_iterator;iterator begin(){return _head-_next; // 隐式类型转换}iterator end(){return _head;}const_iterator begin() const{return _head-_next;}const_iterator end() const{return _head;}void empty_initialize(){_head new Node;_head-_next _head-_prev _head;_size 0;}list(){empty_initialize();}list(initializer_listT lt){empty_initialize();for (auto e : lt){push_back(e);}}list(const list lt){// list();构造函数不能被直接调用empty_initialize();for (auto e : lt){push_back(e);}}void swap(list tmp){std::swap(_head, tmp._head);std::swap(_size, tmp._size);}list operator(const list lt){list tmp(lt);swap(tmp);return *this;}void clear(){while (!empty()){pop_front();}}~list(){clear();delete _head;_head nullptr;_size 0;}size_t size() const{return _size;}bool empty() const{return _size 0;}void push_back(const T val){insert(end(), val);}void push_front(const T val){insert(begin(), val);}iterator insert(iterator pos, const T val);void pop_front(){erase(begin());}void pop_back(){erase(_head-_prev);}iterator erase(iterator pos);private:Node* _head;size_t _size;};templateclass Ttypename listT::iterator listT::insert(iterator pos, const T val){Node* newNode new Node(val);Node* cur pos._node;Node* prev cur-_prev;prev-_next newNode;newNode-_prev prev;newNode-_next cur;cur-_prev newNode;_size;return newNode;}templateclass Ttypename listT::iterator listT::erase(iterator pos){assert(pos ! _head);Node* cur pos._node;Node* next cur-_next;Node* prev cur-_prev;prev-_next next;next-_prev prev;delete cur;--_size;return next;}templateclass Containervoid print_Container(const Container con){for (auto e : con){cout e ;}cout endl;}
}
3、Test.cpp
#include List.hnamespace Lzc
{struct AA{int _a1 1;int _a2 1;};void test_list1(){listint lt;lt.push_back(1);lt.push_back(2);lt.push_back(3);lt.push_back(4);listint::iterator it lt.begin();while (it ! lt.end()){*it 10;cout *it ;it;}cout endl;for (auto e : lt){cout e ;}cout endl;print_Container(lt);listAA lta;lta.push_back(AA());lta.push_back(AA());lta.push_back(AA());lta.push_back(AA());listAA::iterator ita lta.begin();while (ita ! lta.end()){//cout (*ita)._a1 : (*ita)._a2 endl;cout ita-_a1 : ita-_a2 endl;// 特殊处理本来应该是两个-才合理为了可读性省略了一个-// cout ita.operator-()-_a1 : ita.operator-()-_a2 endl;ita;}cout endl;}void test_list2(){listint lt;lt.push_back(1);lt.push_back(2);lt.push_back(3);lt.push_back(4);// insert后it还指向begin(),没有扩容的概念不失效listint::iterator it lt.begin();lt.insert(it, 10); *it 100;print_Container(lt);// erase后it为野指针及时更新// 删除所有的偶数it lt.begin();while (it ! lt.end()){if (*it % 2 0){it lt.erase(it);}else{it;}}print_Container(lt);}void test_list3(){listint lt1;lt1.push_back(1);lt1.push_back(2);lt1.push_back(3);lt1.push_back(4);listint lt2(lt1);print_Container(lt1);print_Container(lt2);listint lt3;lt3.push_back(10);lt3.push_back(20);lt3.push_back(30);lt3.push_back(40);lt1 lt3;print_Container(lt1);print_Container(lt3);}void func(const listint lt){print_Container(lt);}void test_list4(){// 直接构造listint lt0({ 1,2,3,4,5,6 });// 隐式类型转换listint lt1 { 1,2,3,4,5,6,7,8 };const listint lt3 { 1,2,3,4,5,6,7,8 };func(lt0);func({ 1,2,3,4,5,6 });print_Container(lt1);// templateclass T class initializer_list;// { 10, 20, 30 }是一种initializer_listint类型//auto il { 10, 20, 30 };//initializer_listint il { 10, 20, 30 };//cout typeid(il).name() endl;//cout sizeof(il) endl;}
}int main()
{Lzc::test_list1();Lzc::test_list2();Lzc::test_list3();Lzc::test_list4();return 0;
}
注意声明和定义分离时为什么定义时是listT::iterator不是iterator因为iterator在listT中typedef了就属于listT的成员变量了。