首页 > 代码库 > STL 之 list源代码自行实现(iterator)
STL 之 list源代码自行实现(iterator)
一:起因
(1)数据结构里面两种非常重要的存储结构,线性结构中的连续存储结构(代表vector数组)和非连续存储结构(代表list链表),他们两者被广泛的应用在
各个领域,是最基本最基础的两种存储结构;
(2)vector 已经简单的实现了,请看STL 之 vector的实现 之前还实现了STL的string类,请看 STL 之 string 的实现
(3)之前的友元类只是停留在理论层面,真正实现还是头一次;(虽然友元函数,无数次的实现过了)这个友元类正是 Iterator 类,也是初次实现
Iterator,见识了Iterator ++ --运算符的重载,注意仅仅实现了单一方向的++ --(这是源代码这样处理的);友元类非常像java中的内部类。。。
(4)list 自己也是结合STL的源代码,结合数据结构简单的实现的,里面可能有一些处理不当,请大神们指正,谢谢!
二:list实现
(1)list的分析
List是一种可在常数时间内在任何位置执行插入和删除操作的顺序容器。list是双向链表,其迭代器是双向的。与其他顺序容器(array, vector, deque)相比,list
容器在任意位置执行插入、提取、和移动元素的操作更高效,但它不能通过在容器中的位置直接获取元素。
(2)list中的一些主要函数(注意,自己仅仅实现了一部分)
Operations
list::splice() ———— 将一个list A中的元素转移到list B的指定位置,并将A中被转移的元素删除。
list::remove() ———— 将list中指定的元素删除。
list::unique() ———— 删除list中具有相同值的元素,只保留第一个。也可以根据条件删除具有相同条件的元素,只保留第一个。
list::merge() ———— 合并两个list,在合并之前两个list应该先排序,合并之后的list依然有序。也可以自定义排序的条件。
list::sort() ———— 对list中的元素进行排序,变更它们在容器中的位置。sort()还可以按给定条件进行排序。
list::reverse() ——_ 改变list中元素的顺序。
(3)list的实现
a 构造函数 MyList(const MyList<T>& list0)
template<class T> MyList<T>::MyList(const MyList<T>& list0) { size = list0.size; node *cur0 = list0.head; node *tp = new node; tp->data = http://www.mamicode.com/cur0->data;>b +=重载(注意自加)// MyList 的+= 感觉可以改进的,别两个while了 MyList<T>& operator += (const MyList<T>& list) { if(list.head == (*this).head) {// meichuli //cout << "****" << endl; MyList<T> other(list); //cout << "&&&&&" << endl; return *this += other; } if(NULL == list.head)// list 空串 return *this; node *cur = list.head; node *tp = new node; tp->data = http://www.mamicode.com/cur->data;>
c 友元类(内部类)//Iterator class class MyIterator { friend class MyList<T>; protected: node* Iter; MyIterator(node *iter) { Iter = iter; } public: MyIterator(){} // 先加上 MyIterator& operator ++() { Iter = Iter->next; return *this; } // 先减去 MyIterator& operator --() { Iter = Iter->last; return *this; } MyIterator& operator = (MyIterator& it) { Iter = it.Iter; return *this; } bool operator ==(const MyIterator& iter) { return Iter==iter.Iter?true:false; } bool operator !=(const MyIterator& iter) { return Iter!=iter.Iter?true:false; } T operator *() { return Iter->data; } MyIterator &operator[](int n) { for(int i=0;i<n;i++) { assert(NULL!=Iter); Iter=Iter->next; } return *this; } MyIterator &operator +(int n) { for(int i=0;i<n;i++) { assert(NULL!=Iter); Iter=Iter->next; } return *this; } };// MyIterator 内部类
d 字符串反转// reverse 对于同一个串进行交换。。 template<class T> void MyList<T>::reserve(MyIterator& it1,MyIterator& it2) { node *le = it1.Iter; node *ri = it1.Iter; int c = 1; // 不是很理解的 for(;ri!=it2.Iter;ri=ri->next) { c++; } for(;c>1;c-=2) { // 值交换,指针交换?? le->data ^= ri->data; ri->data ^= le->data; le->data ^= ri->data; le = le->next; ri = ri->last; } }e 移除指定元素// remove value template<class T> void MyList<T>::remove(T val) { node *tp = head; for(;tp!=NULL;) { if(tp->data=http://www.mamicode.com/=val)>
(4)完整代码如下:MyList.h#ifndef MYLIST_H_INCLUDED #define MYLIST_H_INCLUDED #include <iostream> #include <cassert> #include <cstdio> #include <string> using namespace std; template<class T> class MyList { friend class MyIterator; protected: struct node { T data; node *next; node *last; }; private: node *head; node *rear; int size; public: //constructor MyList(); MyList(const MyList<T>&); MyList(T,int); MyList(T); //disconstructor ~MyList(){this->clear();} //Iterator class class MyIterator { friend class MyList<T>; protected: node* Iter; MyIterator(node *iter) { Iter = iter; } public: MyIterator(){} // 先加上 MyIterator& operator ++() { Iter = Iter->next; return *this; } // 先减去 MyIterator& operator --() { Iter = Iter->last; return *this; } MyIterator& operator = (MyIterator& it) { Iter = it.Iter; return *this; } bool operator ==(const MyIterator& iter) { return Iter==iter.Iter?true:false; } bool operator !=(const MyIterator& iter) { return Iter!=iter.Iter?true:false; } T operator *() { return Iter->data; } MyIterator &operator[](int n) { for(int i=0;i<n;i++) { assert(NULL!=Iter); Iter=Iter->next; } return *this; } MyIterator &operator +(int n) { for(int i=0;i<n;i++) { assert(NULL!=Iter); Iter=Iter->next; } return *this; } };// MyIterator 内部类 // public:// 功能函数 MyList<T> sublist(MyIterator&,MyIterator&); MyList<T> sublist(MyIterator&,int); MyList<T> sublist(MyIterator&); void push_back(const T); void push_front(const T); void pop_back(); void pop_front(); void clear(); void reserve(); void reserve(MyIterator&,MyIterator&); void replace(T,T); void swap(MyList<T>&); void display(); void display_rear(); void insert(MyIterator&,T); void f_insert(MyIterator&,T); void remove(T); bool exist(T); bool up_order(); bool down_order(); int get_size(){return size;} // swap 值 friend void swap(MyIterator& it1,MyIterator& it2) { (it1.Iter)->data ^= (it2.Iter)->data; (it2.Iter)->data ^= (it1.Iter)->data; (it1.Iter)->data ^= (it2.Iter)->data; } // erase 当前的it,返回it->next MyIterator erase(MyIterator& it) { assert(0 != size); size--; if(0 == size) { head = NULL; rear = NULL; return MyIterator(NULL); } if(it.Iter == head) { node *tp = head; head = head->next; head->last = NULL; delete(tp); return MyIterator(head); } if(it.Iter == rear) { node *tp = rear; rear = rear->last; rear->next = NULL; delete(tp); return MyIterator(NULL); } (it.Iter)->last->next = (it.Iter)->next; (it.Iter)->next->last = (it.Iter)->last; node *ans = it.Iter->next; delete(it.Iter); return MyIterator(ans);// 返回结果 } // find 返回ter指针 MyIterator find(T val) { node *tp = head; for(;tp!=NULL;tp=tp->next) { if((tp->data)==val) return MyIterator(tp); } return MyIterator(NULL); } MyIterator begin(){return MyIterator(head);} MyIterator end(){return MyIterator(rear);} T& front(){return head->data;} T& back(){return rear->data;} bool empty(){return 0==size?true:false;} void link(MyList<T>& list0){*this += list0;} void reset(MyIterator& it,T val){(it.Iter)->data = http://www.mamicode.com/val;}>
(5) 测试韩式main#include "MyList.h" using namespace std; int main() { MyList<string> list0; MyList<string> list7("ccc",3); list0 += list7; list0.display_rear(); string tmp = "aaa"; list0.push_back(tmp); list0.push_front("bbbb"); list7.display(); list0 += list0; list0.display_rear(); cout << "1: " << list0.get_size() << " ," << endl; //MyList<string> list1(tmp); list0.clear(); //list1.display(); //list1.clear(); //list1.display(); MyList<int> list1(5,4); list1.push_back(1111); MyList<int>::MyIterator it = list1.begin(); //++it; list1.insert(it+2,2222); list1.f_insert(it,555); //list1.push_front(5555); //list1.pop_back(); //list1.pop_front(); cout << "2: " << list1.get_size() << ", "; list1.display(); MyList<int> list2(list1); cout << "3: " << list2.get_size() << ", "; list2.display(); list2.reserve(list2.begin()+2,list2.begin()+4); list2.display_rear(); MyList<int> list3(3,6); list3.swap(list1); list1.reserve(); cout << "4: " << list1.get_size() << ","; list1.display(); list1.push_back(33); cout << "5:" << list1[6] << ",," << list1.down_order() << list1.up_order() << endl; //list1.display_rear(); MyList<int> list4= list2.sublist(list2.begin()+2,list2.begin()+4); list4.display(); return 0; }
STL 之 list源代码自行实现(iterator)