练习C/C++基本功(列表和迭代器的实现和测试)

来源:互联网 发布:php李文凯百度百科 编辑:程序博客网 时间:2024/04/30 06:55

                                          练习C/C++基本功(列表和迭代器的实现和测试)

#include "stdafx.h"#include <iostream>#include "stdlib.h"#include "stdio.h"#include "time.h"using namespace std;long DEFAULT_LIST_CAPACITY = 30;template <class Item> class List{public:  List ( long size = DEFAULT_LIST_CAPACITY )  {      arr=new Item[size];       this->count=0;  }  List ( List& ls )  {      if(ls.arr)          delete arr;      arr=new Item[ls.count];      for(int i=0;i<ls.count;i++)          arr[i]=ls.arr[i];      this->count=ls.count;  }      ~List ( )  {      if(arr)         delete []arr;      arr=NULL;  }  List operator = ( const List& ls )  {      if(this=&ls)         return *this;      if(ls.arr)         delete arr;      arr=new Item[ls.count];      for(int i=0;i<ls.count;i++)         arr[i]=ls.arr[i];      this->count=ls.count;  }  long Count ( ) const  {      return this->count;  }  Item& Get ( long index ) const  {       return arr[index];   }    Item& First ( ) const  {       return arr[0];  }    Item& Last ( ) const  {       return arr[this->count-1];  }  bool Includes ( const Item& item) const  {       for(int i=0;i<this->count;i++)          if(item==arr[i])              return true;       return false;  }          void Append ( const Item& item)  {       Item* temp=new Item[this->count+1];       for(int i=0;i<this->count;i++)           temp[i]=arr[i];       temp[i+1]=item;       delete []arr;       arr=temp;       this->count++;  }    void Prepend ( const Item& item)  {       Item* temp=new Item[this->count+1];       for(int i=1;i<this->count+1;i++)          temp[i]=arr[i];       temp[0]=item;       delete []arr;       arr=temp;       this->count++;  }  void Remove ( const Item& item)  {       Item* temp=new Item[count-1];       for(int i=0;i<this->count;i++)          if(item==arr[i])          {              i++;          }          else          {              temp[i]=arr[i];          }       delete []arr;       arr=temp;       this->count--;  }    void RemoveLast ( const Item& )  {      Item* temp=new Item[count-1];      for(int i=0;i<count-1;i++)          temp[i]=arr[i];      count--;  }  void RemoveFisrt ( const Item& )  {      Item* temp=new Item[count-1];      for(int i=0;i<count-1;i++)         temp[i]=arr[i+1];      count--;  }  void RemoveAll ( const Item& )  {      delete []arr;      arr=NULL;      count=0;  }  Item& Top ( ) const  {      return arr[0];  }  void Push ( const Item& item )  {      Item* temp=new Item[count+1];      for(int i=0;i<count;i++)         temp[i]=arr[i];      temp[i+1]=item;      count++;  }  Item& Pop ()  {      Item* temp=new Item[count-1];      Item item=arr[0];      for(int i=0;i<count-1;i++)          temp[i]=arr[i+1];      delete arr;      arr=temp;      return item;  }private:  Item* arr;  int count;};template <class Item> class Iterator {public:            virtual void First ( ) = 0;            virtual void Next ( ) = 0;            virtual bool IsDone ( ) const = 0;            virtual Item CurrentItem ( ) const = 0;protected:   Iterator ( ) {}};template <class Item> class ListIterator : public Iterator<Item> {public:    ListIterator(const List<Item>* aList);    virtual void First();    virtual void Next();    virtual bool IsDone() const;    virtual Item CurrentItem() const;private:    const List<Item>* _list;    long _current;};template <class Item>ListIterator<Item>::ListIterator ( const List<Item>* aList ) : _list(aList), _current(0) { }template <class Item>void ListIterator<Item>::First () { _current = 0; }template <class Item>void ListIterator<Item>::Next () {        _current++;}template <class Item>bool ListIterator<Item>::IsDone () const { return _current >= _list->Count(); }template <class Item>Item ListIterator<Item>::CurrentItem () const {    if (IsDone())         {        throw "IteratorOutOfBounds";    }    return _list->Get(_current);}class Item{public: Item():a(0) { } Item(int a) {     this->a=a; } bool operator!=(const Item& item) {     if(this->a!=item.a)         return true;     else         return false; }friend ostream& operator<<(ostream& os,const Item& item) {     os<<item.a<<" ";     return os; }private:   int a;};int main(int argc, char* argv[]){      List<Item>* ls=new List<Item>(10);     ListIterator<Item> itor(ls);     for(int i=0;i<10;i++)     {         Item item(i);         ls->Prepend(item);     }     while(!itor.IsDone())     {         cout<<itor.CurrentItem();         itor.Next();     }     return 0;}