List With Iterator(STL)
2016-05-15 16:37
197 查看
实现标准模板库中的功能
下面是main函数部分
input :
4
1 2 3 4
output:
test size
0
empty
test push and pop
[1 ]
[]
[1 ]
[]
[1 ]
[]
[1 ]
4
1
2
3
4
8
[4 3 2 1 1 2 3 4 ]
[2 1 1 2 3 ]
front : 2
back : 3
not empty
test begin and end
2 1 1 2 3
test insert and erase and ++ –
100
200
[100 2 1 1 2 3 200 ]
1
1
[100 1 2 3 200 ]
[99 101 100 1 2 3 200 ]
test constructor
[9 9 9 9 9 ]
[90 101 100 1 2 3 200 ]
[90 101 100 1 2 3 200 ]
[90 101 100 ]
#include<iostream> #include<string> #include<cassert> using namespace std; template<class T> class list { public: struct listelem; // forward declarations // 也可将struct和iterator的定义直接放在前面 class iterator; // 构造函数 list() { h.ptr = t.ptr = NULL; } // 注意构造函数中,首先都应该将head和tail置为NULL // n个值为c的链表 list(size_t n_elements, const T& c) { h.ptr = t.ptr = NULL; for (size_t i = 0; i < n_elements; ++i) { // 此处用push_front和push_back都可以 push_back(c); } } list(const list& x) { h.ptr = t.ptr = NULL; // 重要 list::iterator iter = x.begin(); while (iter != NULL) { // 下面两句等价于push_back(*iter++); push_back(*iter); iter++; } } list(iterator b, iterator e) { h.ptr = t.ptr = NULL; while (b != e) { // 等价于push_back(*b++); push_back(*b); b++; } } ~list() { this->clear(); } iterator begin() const { return h; } iterator end() const { // 返回的是最后一个迭代器的下一个 iterator temp; return (temp.ptr == NULL ? iterator(0) : ++temp); } size_t size() { size_t count = 0; iterator temp = h; while (temp != end()) { temp++; count++; } return count; } void push_front(const T& c) { listelem* temp = new listelem(c, h, NULL); if (empty()) { // 链表为空时或是if(h == NULL) // 或是if(h.ptr == NULL) h.ptr = t.ptr = temp; } else { // 链表不为空时 h->prev = temp; h.ptr = temp; } } void push_back(const T& c) { listelem* temp = new listelem(c, NULL, t); if (empty()) { h.ptr = t.ptr = temp; } else { t->next = temp; t.ptr = temp; } } void pop_front() { if (empty()) return; // 链表为空的情况 listelem* temp = h.ptr; if (h.ptr == t.ptr) { // 只有一个节点的情况 h.ptr = NULL; t.ptr = NULL; delete temp; } else { h.ptr = h->next; h->prev = NULL; delete temp; } } void pop_back() { if (empty()) return; listelem* temp = t.ptr; if (h.ptr == t.ptr) { h.ptr = t.ptr = NULL; delete temp; } else { t.ptr = t->prev; t->next = NULL; delete temp; } } iterator insert(iterator position, const T& val) { listelem* p = position.ptr; if (p == end()) { // 或者是p == NULL push_back(val); return t; } else if (p == begin()) { // 或者是 p->prev == NULL push_front(val); return begin(); } else { listelem* temp = new listelem(val, p, p->prev); temp->next->prev = temp; temp->prev->next = temp; return iterator(temp); } } iterator erase (iterator position) { listelem* temp = position.ptr; if (temp == NULL||empty()) return iterator(0); if (temp == h) { pop_front(); return h; } temp->prev->next = temp->next; temp->next->prev = temp->prev; listelem* re = temp->next; delete temp; return iterator(re); } bool empty() const { return h.ptr == 0; } T& front() { return *h; } T& back() { return *t; } void clear() { while (h.ptr != 0) { pop_front(); } h.ptr = t.ptr = NULL; } friend ostream& operator << (ostream& out, const list& x) { list<T>::iterator p = x.begin(); out << "["; while (p != 0) { out << *p << " "; ++p; } out << "]"; return out; } struct listelem { // list cell T data; listelem *next, *prev; listelem(const T& s, listelem* n, listelem* p) { data = s; next = n; prev = p; } }; class iterator { public: friend class list; explicit iterator(listelem* p = 0) { ptr = p; } iterator(const iterator& other) { ptr = NULL; ptr = other.ptr; } iterator& operator ++ () { // ++p; ptr = ptr->next; return *this; } iterator& operator -- () { ptr = ptr->prev; return *this; } iterator operator ++ (int) { // p++; iterator temp = *this; ptr = ptr->next; return temp; } iterator operator -- (int) { iterator temp = *this; ptr = ptr->prev; return temp; } listelem* operator -> () { return ptr; } T& operator * () { return ptr->data; } operator listelem * () { return ptr; } // conversion; private: listelem* ptr; // current listelem or 0; }; private: iterator h, t; // head and tail };
下面是main函数部分
int main() { list<int> li; cout << "test size" << endl; cout << li.size() << endl; cout << (li.empty() ? "empty" : "not empty") << endl; int n; // n >= 3 cout << "test push and pop" << endl; li.push_back(1); cout << li << endl; li.pop_back(); cout << li << endl; li.push_front(1); cout << li << endl; li.pop_front(); cout << li << endl; li.push_back(1); cout << li << endl; li.pop_front(); cout << li << endl; li.push_front(1); cout << li << endl; li.pop_back(); cin >> n; for (int i = 0; i < n; i++) { int tmp; cin >> tmp; li.push_back(tmp); li.push_front(tmp); } cout << li.size() << endl; cout << li << endl; li.pop_back(); li.pop_front(); li.pop_front(); cout << li << endl; cout << "front : " << li.front() << endl; cout << "back : " << li.back() << endl; cout << (li.empty() ? "empty" : "not empty") << endl; cout << "test begin and end" << endl; list<int>::iterator it = li.begin(); while (it != li.end()) { cout << it->data << " "; it++; } cout << endl; cout << "test insert and erase and ++ --" << endl; it = li.begin(); cout << *(li.insert(it, 100)) << endl; it = li.end(); cout << *(li.insert(it, 200)) << endl; cout << li << endl; it = li.begin(); cout << *(li.erase(++it)) << endl; it = li.begin(); it++; cout << *(li.erase(it)) << endl; cout << li << endl; it = li.begin(); it++; it--; li.insert(it, 101); it = li.begin(); ++it; --it; li.insert(it, 99); cout << li << endl; it = li.begin(); *it = 90; cout << "test constructor" << endl; list<int> li2(5, 9); list<int> li3(li); it = li.begin(); list<int>::iterator it2 = it; ++(++(++it2)); list<int> li4(li.begin(), li.end()); list<int> li5(it, it2); cout << li2 << endl; cout << li3 << endl; cout << li4 << endl; cout << li5 << endl; return 0; }
input :
4
1 2 3 4
output:
test size
0
empty
test push and pop
[1 ]
[]
[1 ]
[]
[1 ]
[]
[1 ]
4
1
2
3
4
8
[4 3 2 1 1 2 3 4 ]
[2 1 1 2 3 ]
front : 2
back : 3
not empty
test begin and end
2 1 1 2 3
test insert and erase and ++ –
100
200
[100 2 1 1 2 3 200 ]
1
1
[100 1 2 3 200 ]
[99 101 100 1 2 3 200 ]
test constructor
[9 9 9 9 9 ]
[90 101 100 1 2 3 200 ]
[90 101 100 1 2 3 200 ]
[90 101 100 ]
相关文章推荐
- 第95讲:使用Scala开发集群运行的Spark来实现在线热搜索词获取
- Jquery全选反选
- Android Json数据的解析+ListView图文混排+缓存算法Lrucache 仿知乎
- keepalived ,lvs,tomcat 高可用,高并发,高性能 应用架构的搭建
- 数组首地址给赋给 指针的问题
- C++ 使用模板实现的一个List
- websites-pages-jekyll - github blog
- xUtils简介及其使用方法
- TP框架基础(三)
- NVIC
- JS 使用 Android + IOS 相册 + 相机 进行自定义头像 + 限制裁剪后图片尺寸 + base64 string 与 图片互相转换
- 【数据结构】表之链表
- 利用Access-Control-Allow-Origin响应头解决跨域请求
- 【grunt整合版】30分钟学会使用grunt打包前端代码
- ASPxGridView常用总结
- 原生sql语句执行
- python write file
- iOS 网络编程:NSURLConnection
- [PWA] 0. Introduce to Offline First
- Spring_Spring_教程8_注入_复杂类型的注入