容器,迭代器实作手法

容器指的是各种存放元素的玩意: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;
}

posted @ 2011-04-15 10:23  luck_net  阅读(192)  评论(0编辑  收藏  举报