容器,迭代器实作手法
容器指的是各种存放元素的玩意:list,vector,deque,queue,prority_queue,stack,set,multiset,map,multimap
迭代器:类似指针的东西,就是指向各个元素的智能指针。
节点:容器中元素的类型,例如链表中的元素,我们可以把节点设置为一个结构体,包含元素和next。。。。
#include <iostream>
#include <algorithm>
#include <string>
using namespace std;
//链表节点
template<typename T>
class ListItem
{
public:
T _value;
ListItem* _next;
public:
T value()const{return _value;}
ListItem* next()const{return _next;}
ListItem(T value):_value(value),_next(NULL){}
bool operator==(const ListItem<T>& xtemp)
{
if (xtemp._value == _value)
{
return true;
}
else
return false;
}
};
//链表
template<typename T>
class List
{
private:
ListItem<T>* _front;
ListItem<T>* _end;
long _size;
public:
void insert_front(T value);
void insert_end(T value);
void display(std::ostream &os = std::cout)const;
List():_front(NULL),_end(NULL),_size(0){}
ListItem<T>* front(){return _front;}
ListItem<T>* end(){return _end;}
ListItem<T>* size(){return _size;}
};
template<typename T>
void List<T>::insert_front(T value)
{
ListItem<T>* temp = new ListItem<T>(value);
_size++;
if (_front == NULL)
{
_front = temp;
_end = NULL;
_front->_next = _end;
}
else
{
temp->_next = _front;
_front = temp;
}
}
template<typename T>
void List<T>::insert_end(T value)
{
ListItem<T>* temp(value);
_end->_next = temp;
}
template<typename T>
void List<T>::display(std::ostream &os = std::cout )const
{
ListItem<T>* temp ;
temp = _front;
while(temp != NULL)
{
os<< temp->value() <<endl;
temp = temp->next();
}
}
//迭代器实作
template<typename Item>
struct ListIter
{
Item* ptr;
ListIter(Item* p = 0):ptr(p){}
Item& operator*()const{return *ptr;}
Item* operator->()const{return ptr;}
ListIter& operator++()
{
ptr = ptr->next();
return *this;
}
bool operator==(const ListIter& i)const
{
return ptr == i.ptr;
}
bool operator!=(const ListIter& i)const
{
return ptr!=i.ptr;
}
};
void main()
{
List<int> a;
a.insert_front(1);
a.insert_front(3);
a.insert_front(2);
a.insert_front(4);
a.insert_front(5);
a.insert_front(6);
a.display(cout);
typedef ListIter<ListItem<int> > Iter;
Iter begin(a.front());
Iter end(a.end());
Iter iter;
iter = find(begin,end,ListItem<int>(13));
if (iter == end)
{
cout<<"not find"<<endl;
}
else
cout<<"find"<<endl;
}