list C++实现

list C++实现

模仿STL中list,实现了其大部分功能。list可以高效地利用内存资源,常数时间的插入删除操作。并且,list除了erase外,不怎么存在迭代器失效的现象。

#include<iostream> #include<iterator> #include<algorithm> using namespace std; template<class T> struct _List_node{ typedef void* void_pointer; void_pointer next; void_pointer prev; T data; }; template<class T,class Ref,class Ptr> class _List_iterator{ public: typedef _List_iterator<T, T&, T*> iterator; typedef _List_iterator<T, const T&, const T*> const_iterator; typedef _List_iterator<T, Ref, Ptr> self; typedef T value_type; typedef Ptr pointer; typedef Ref reference; typedef _List_node<T>* link_type; typedef size_t size_type; typedef ptrdiff_t difference_type; link_type node; _List_iterator(link_type x):node(x){} _List_iterator(){} _List_iterator(const iterator &x):node(x.node){} bool operator== (const iterator& x )const{return node == x.node;} bool operator!= (const iterator& x)const{return node != x.node;} reference operator*()const{return (*node).data;} pointer operator->()const{return &(operator*());} T operator *(){return node->data;} iterator &operator++(int){ iterator tmp = *this; ++*this; return tmp; } iterator& operator++(){ node = (link_type)((*node).next); return *this; } iterator& operator--(){ node = (link_type)((*node).prev); return *this; } iterator& operator--(int){ iterator tmp = *this; --*this; return tmp; } }; template<class T> class List{ public: typedef _List_node<T>* link_type; typedef _List_iterator<T,T&,T*> iterator; typedef T value_type; typedef T* pointer; typedef T& reference; typedef size_t size_type; typedef ptrdiff_t difference_type; protected: typedef _List_node<T> list_node; link_type node; //..... public: List(){create_node();} List(List& alist){ create_node(); for(List<T>::iterator ite=alist.begin();ite!=alist.end();++ite) push_back(*ite); } iterator begin(){return (link_type)((*node).next);} iterator end(){return node;} bool empty()const{return node->next == node;} size_type size()const{ size_type result = 0; distance(begin(),end(),result); return result; } reference front(){return *begin();} reference back(){return *(--end());} iterator insert(iterator position,const T& x){ link_type tmp = create_node(x); tmp->next = position.node; tmp->prev = position.node->prev; (link_type(position.node->prev))->next = tmp; position.node->prev = tmp; return tmp; } link_type create_node(const T& x){ link_type p = new list_node; p->data = x; p->prev = NULL; p->next = NULL; return p ; } void create_node(){ node = new list_node(); node->next = node; node->prev = node; } inline difference_type distance(iterator first,iterator last,difference_type &n){ n = 0; while(first != last){++first;++n;} return n; } void push_front(const T& x){insert(begin(),x);} void push_back(const T& x){insert(end(),x);} void pop_front(){erase(begin());} void pop_back(){iterator tmp = end();erase(--tmp);} iterator erase(iterator position){ link_type next_node = link_type(position.node->next); link_type prev_node = link_type(position.node->prev); prev_node->next = next_node; next_node->prev = prev_node; destory_node(position.node); return iterator(next_node); } iterator erase(iterator first,iterator last){ while(first!=last){ first = erase(first); } return last; } void destory_node(link_type p){delete p;} ~List(){ clear(); delete node; } void clear() { while (!empty()) pop_back(); } iterator find(const T& value){ iterator first = begin(); while(first!= end()){ if(*first == value)return first; ++first; } return first; } void remove(const T& value){ iterator first = begin(); iterator last = end(); while(first != last){ if(*first == value)first = erase(first); else ++first; } } void transfer(iterator position,iterator first,iterator last){ if(position != last){ (*(link_type((*last.node).prev))).next = position.node; (*(link_type((*first.node).prev))).next = last.node; (*(link_type((*position.node).prev))).next = first.node; link_type tmp = link_type((*position.node).prev); (*position.node).prev = (*last.node).prev; (*last.node).prev = (*first.node).prev; (*first.node).prev = tmp; } } void splice(iterator position,List<T> &x){ if(!x.empty()) transfer(position,x.begin(),x.end()); } void splice(iterator position,List<T> &,iterator i){ iterator j = i; ++j; if(position == i||position == j)return; transfer(position,i,j); } void splice(iterator position,List<T>&,iterator first,iterator last){ if(first!=last) transfer(position,first,last); } }; void test1(){ //数据类型存储測试 List<int> listInt; listInt.push_back(1); listInt.push_back(2); listInt.push_back(3); for(List<int>::iterator ite = listInt.begin();ite != listInt.end();++ite) cout<<*ite<<" "; cout<<endl; List<double> listDouble; listDouble.push_back(0.1); listDouble.push_back(0.2); listDouble.push_back(0.3); for(List<double>::iterator ite = listDouble.begin();ite != listDouble.end();++ite) cout<<*ite<<" "; cout<<endl; class A{ int data; public: A(int a=0):data(a){} operator int(){return data;} }; List<A> listA; A a(1),b(2),c(3); listA.push_back(a); listA.push_back(b); listA.push_back(c); for(List<A>::iterator ite = listA.begin();ite != listA.end();++ite) cout<<*ite<<" "; cout<<endl; } void test2(){// 功能測试 List<int> listInt; List<int>::iterator ite; listInt.push_back(1); listInt.push_back(2); listInt.push_back(3); listInt.push_back(4); listInt.push_back(5); listInt.push_back(6); listInt.push_back(7); listInt.push_back(8); listInt.push_back(9); for(ite = listInt.begin();ite != listInt.end();++ite) cout<<*ite<<" "; cout<<endl; List<int> listInt2(listInt); for(ite = listInt2.begin();ite != listInt2.end();++ite) cout<<*ite<<" "; cout<<endl; listInt.push_front(0); for(ite = listInt.begin();ite != listInt.end();++ite) cout<<*ite<<" "; cout<<endl; listInt.pop_back(); listInt.pop_front(); for(ite = listInt.begin();ite != listInt.end();++ite) cout<<*ite<<" "; cout<<endl; ite = listInt.find(6); if(ite != listInt.end())listInt.erase(ite); for(ite = listInt.begin();ite != listInt.end();++ite) cout<<*ite<<" "; cout<<endl; ite = listInt.find(5); if(ite != listInt.end())listInt.erase(ite,listInt.end()); for(ite = listInt.begin();ite != listInt.end();++ite) cout<<*ite<<" "; cout<<endl; listInt.pop_front(); listInt.pop_back(); for(ite = listInt.begin();ite != listInt.end();++ite) cout<<*ite<<" "; cout<<endl; listInt.remove(2); for(ite = listInt.begin();ite != listInt.end();++ite) cout<<*ite<<" "; cout<<endl; listInt.clear(); for(ite = listInt.begin();ite != listInt.end();++ite) cout<<*ite<<" clear()"; cout<<endl; } void test3(){//拼接功能測试 List<int> listInt1; List<int>::iterator ite; listInt1.push_back(1); listInt1.push_back(2); listInt1.push_back(3); listInt1.push_back(4); listInt1.push_back(5); List<int> listInt2(listInt1); cout<<"listInt1: "; for(ite = listInt1.begin();ite != listInt1.end();++ite) cout<<*ite<<" "; cout<<endl; cout<<"listInt2: "; for(ite = listInt2.begin();ite != listInt2.end();++ite) cout<<*ite<<" "; cout<<endl; ite = listInt1.find(4); List<int>::iterator first = listInt2.find(2); List<int>::iterator last = listInt2.find(4); listInt1.transfer(ite,first,last); for(ite = listInt1.begin();ite != listInt1.end();++ite) cout<<*ite<<" "; cout<<endl; for(ite = listInt2.begin();ite != listInt2.end();++ite) cout<<*ite<<" "; cout<<endl; ite = listInt1.find(2); listInt1.splice(ite,listInt2); for(ite = listInt1.begin();ite != listInt1.end();++ite) cout<<*ite<<" "; cout<<endl; } int main(){ cout<<"--------data type test----------"<<endl; test1(); cout<<"--------function test----------"<<endl; test2(); cout<<"---------splice test-----------"<<endl; test3(); }

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/119251.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • Keil系列教程(汇总)「建议收藏」

    Keil系列教程(汇总)「建议收藏」推荐分享一个大神的人工智能教程。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到人工智能的队伍中来!http://www.captainbed.net/strongerhuang我的网站:https://www.strongerhuang.com我的知乎:https://www.zhihu.com/people/strongerHuang.com推荐在我公众…

  • js原生拖拽的两种方法

    js原生拖拽的两种方法一.mousedown、mousemove和mouseup 拖着目标元素在页面任意位置如果要设置物体拖拽,那么必须使用三个事件,并且这三个事件的使用顺序不能颠倒。1.onmousedown:鼠标按下事件2.onmousemove:鼠标移动事件3.onmouseup:鼠标抬起事件重点:1、一定要绝对定位,脱离文档流才可以移动。2、绑定拖拽的元素,移动和鼠标松开后是对docu…

  • 太极阴,阳虚拟框架—-各种插件大总结(烂尾)[通俗易懂]

    太极阴,阳虚拟框架—-各种插件大总结(烂尾)[通俗易懂]最近心血来潮又想起了折腾自己的安卓手机,不由得就想起来了几年前的Xposed框架.于是又开始跃跃欲试起来然而在网上冲浪许久后,虽然人们七嘴八舌但我大概还是看出来了Xposed对于高版本android好像已经不太能用了,更何况我用的还是MIUI于是,我发现了一个新的玩意—-太极框架.(咳,应该也不是啥新东西了只不过我才关注到而已)当然,现在还有好多类似的东西,但这不是我们的主题….

  • Python终将成为最火爆的编程语言,因为它是属于大众的「建议收藏」

    Python终将成为最火爆的编程语言,因为它是属于大众的「建议收藏」很多培训机构宣称py是人工智能必备的编程语言,打着速成的旗号来引诱学者学习python。事实却并不是这样的,万丈高台平地起,不论你想从事怎样的编程工作,都是从最基本的编程技巧开始的;Python并不适合所有人,如果你是一个编程类专业的学生,适度了解python是有必要的(python的第三方库的爆发造就了不少C/C++程序员的就业),但如果你作为一个非编程类专业但又需要了解编程的人…

  • 黑盒测试的常见的测试用例设计方法有哪些[通俗易懂]

    黑盒测试的常见的测试用例设计方法有哪些[通俗易懂]测试用例怎么设计?一般根据业务知识掌握,之前已有的回归测试用例,测试知识库,测试需求开始设计。黑盒测试的常见的测试用例设计方法有哪些?1)等价类划分:等价类是指某个输入域的子集合.在该子集合中,各个输入数据对于揭露程序中的错误都是等效的.并合理地假定:测试某等价类的代表值就等于对这一类其它值的测试.因此,可以把全部输入数据合理划分为若干等价类,在每一个等价类中取一个数据作为测试的输入条件,就可以用少量代表性的测试数据.取得较好的测试结果.等价类划分可有两种不同的情况:有效等价类和无效等价类.

  • 多线程(四)—-继承Thread和实现Runnable的区别

    多线程(四)—-继承Thread和实现Runnable的区别

    2020年11月12日

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号