【STL】list的应用模拟实现
2016-12-04 22:58
471 查看
STL:标准模板库,惠普实验室开发的一系列软件的统称。
STL的六大组件:
容器,迭代器,算法,适配器,空间配置器,仿函数。
下面模拟序列式容器的一个列表:list(本质:带头结点的双向循环链表)。
库中list的使用:
运行结果:
模拟list:
运行结果:
STL的六大组件:
容器,迭代器,算法,适配器,空间配置器,仿函数。
下面模拟序列式容器的一个列表:list(本质:带头结点的双向循环链表)。
库中list的使用:
#include <iostream> #include <list> #include <algorithm> using namespace std; //迭代器的使用 void ListTest() { list<int> l1; l1.push_back(1); l1.push_back(2); l1.push_back(3); l1.push_back(4); l1.push_back(5); //正向迭代器 list<int>::iterator it1 = l1.begin(); while(it1 != l1.end()) { cout<<*it1<<" "; it1++; } cout<<endl; //反向迭代器 list<int>::reverse_iterator it2 = l1.rbegin(); while(it2 != l1.rend()) { cout<<*it2<<" "; it2++; } cout<<endl; //max_size():整型的最大值/每个元素的字节数 unsigned int i; cout << "Enter number of elements: "; cin >> i; if (i<l1.max_size()) l1.resize(i); else cout << "That size exceeds the limit.\n"; cout<<l1.size()<<endl; //insert:在指定位置的数据之前插入 list<int>::iterator it3 = l1.begin(); it3++; l1.insert(it3,10); it3 = l1.begin(); while(it3 != l1.end()) { cout<<*it3<<" "; it3++; } cout<<endl; //erase:擦除指定位置的元素(由于list中没有find接口,所以需要引入算法头文件) list<int>::iterator it4 = find(l1.begin(),l1.end(),10); if(it4 != l1.end()) l1.erase(it4); it4 = l1.begin(); while(it4 != l1.end()) { cout<<*it4<<" "; it4++; } cout<<endl; //迭代器失效 list<int>::iterator it5 = l1.begin(); //if (it5 != l1.end()) //{ // l1.erase(it5);//释放之后it5指向随机空间 //} //it5++;//对随机空间++,导致程序崩溃 //解决方法:1、先加加,再删除 if (it5 != l1.end()) { it5++; l1.erase(it5); } //2、利用返回值对其进行改进 it5 = l1.begin(); if (it5 != l1.end()) { it5 = l1.erase(it5); } else { it5++; } //remove:删除值某特定值的元素 l1.remove(4); it5 = l1.begin(); while(it5 != l1.end()) { cout<<*it5<<" "; it5++; } cout<<endl; } int main() { ListTest(); system("pause"); return 0; }
运行结果:
模拟list:
//模拟list(带头结点的双向循环链表) #pragma once #include <iostream> using namespace std; #include <Cassert> template <class T> struct ListNode { ListNode <T>* _prev; ListNode <T>* _pnext; T _data; ListNode(const T& data) :_data(data) ,_prev(NULL) ,_pnext(NULL) {} }; // T T& T* //typedef ListIterator<T,T&,T*> Iterator;//普通迭代器 //typedef ListIterator<T,const T&, const T*> ConstIterator;//const迭代器 template <class T, class Ref, class Ptr> struct ListIterator { typedef ListNode<T> Node; typedef ListIterator<T, Ref, Ptr> Self; Node* _node; ListIterator() {} ListIterator(Node* node) :_node(node) {} bool operator==(const Self& s) { return s._node == _node; } bool operator!=(const Self& s) { return s._node != _node; } //T& operator*() Ref operator*() { return _node->_data; } //T* operator->() Ptr operator->() { return &_node->_data; } Self& operator++()//前置++ { _node = _node->_pnext; return *this; } Self operator++(int)//后置++ { Self tmp(*this); _node = _node->_pnext; return tmp; } Self& operator--()//前置-- { _node = _node->_prev; return *this; } Self operator--(int)//后置-- { //Self tmp(*this); Self tmp(_node); _node = _node->_prev; return tmp; } }; template <typename T> class List { public: typedef ListNode <T> Node; typedef ListIterator<T,T&,T*> Iterator;//普通迭代器 typedef ListIterator<T,const T&, const T*> ConstIterator;//const迭代器 public: List() :_head(BuyNode(T())) { _head->_pnext = _head; _head->_prev = _head; } void PushBack(const T& data) { Node* tail = _head->_prev; Node* newnode = BuyNode(data); tail->_pnext = newnode; newnode->_prev = tail; newnode->_pnext = _head; _head->_prev = newnode; } void PopBack() { Erase(--End()); } void PushFront(const T& data) { Insert(Begin(),data); } void PopFront() { Erase(Begin()); } template <typename InputIterator>//模板类中的模板函数 void Insert(Iterator pos, InputIterator first, InputIterator last) { while (first != last) { Insert(pos, *first); ++first; } } Iterator Insert(Iterator pos,const T& data) { assert(pos._node); Node* cur = pos._node; Node* prev = cur->_prev; Node* tmp = new Node(data); prev->_pnext = tmp; tmp->_prev = prev; tmp->_pnext = cur; cur->_prev = tmp; return tmp; } Iterator Erase(Iterator pos) { assert(pos._node && pos._node != _head); Node* prev = pos._node->_prev; Node* next = pos._node->_next; prev->_next = next; next->_prev = prev; delete pos._node; return Iterator(next);//返回下一个节点,防止迭代器失效 } Iterator Begin() { //return Iterator(_head->_next); return _head->_pnext; //自动进行隐式类型转换: //构造函数和拷贝构造同一步骤使用,编译器会进行自动优化,只调用一个 } Iterator End() { //return Iterator(_head); return _head;//自动进行隐式类型转换 //构造函数和拷贝构造同一步骤使用,编译器会进行自动优化,只调用一个 } ConstIterator Begin() const { //return ConstIterator(_head->_next); return _head->_pnext;//自动进行隐式类型转换 //构造函数和拷贝构造同一步骤使用,编译器会进行自动优化,只调用一个 } ConstIterator End() const { //return ConstIterator(_head); return _head;//自动进行隐式类型转换 //构造函数和拷贝构造同一步骤使用,编译器会进行自动优化,只调用一个 } private: Node* BuyNode(const T& data) { return new Node(data); } protected: Node* _head;//指向头结点的指针 }; void PrintListConst(const List<int>& l) { List<int>::ConstIterator it = l.Begin(); while (it != l.End()) { cout<<*it<<" "; it++; } cout<<endl; } void PrintList(List<int>& l) { List<int>::Iterator it = l.Begin(); while (it != l.End()) { cout<<*it<<" "; it++; } cout<<endl; } void TestList() { List<int> l1; l1.PushBack(1); l1.PushBack(2); l1.PushBack(3); l1.PushBack(4); PrintList(l1); List<int> l2; l2.PushBack(5); l2.PushBack(6); l2.PushBack(7); List<int>::Iterator pos = l1.Begin(); l1.Insert(pos, l2.Begin(), l2.End()); PrintListConst(l1); } int main() { TestList(); system("pause"); return 0; }
运行结果:
相关文章推荐
- 【STL】list的应用和模拟实现
- 【STL】 list的应用及模拟实现
- 模拟实现STL中的list
- 【STL】迭代器与List的模拟实现
- STL库中的list的使用和模拟实现
- 模拟实现STL中的list
- 使用List模拟实现STL中的Queue
- 【C++】模拟实现STL中的list
- STL--> list 双向循环链表容器 接口使用及介绍。 模拟实现 STL list容器
- 模拟实现STL中的List容器
- 【C++ STL应用与实现】6: 如何使用std::list
- 模拟实现STL中list(用迭代器)
- 【C++ STL应用与实现】7: 如何使用std::forward_list 单链表 (since C++11)
- 数据结构::模拟STL实现list
- STL-模拟实现list
- 模拟实现STL下的list容器
- STL中list的使用及模拟实现
- 迭代器模拟实现STL中的list
- STL-模拟实现List
- STL容器中list与迭代器iterator的模拟实现