当前位置:编程学习 > C/C++ >>

深入设模式之:迭代器模式之编写一个兼容STL 算法的Iterator

[cpp]
#include <vector>  
#include <algorithm>  
 
class Seat 

public: 
Seat(int no):no_(no) {} 
int no_; 
}; 
 
 
class Table 

static const std::size_t BEGIN_SEAT = 1; 
static const std::size_t INVALID_SEAT = 0; 
static const std::size_t END_SEAT = 9; 
public: 
Table() 

seats_.push_back(new Seat(1) ); 
seats_.push_back(new Seat(2) ); 
seats_.push_back(new Seat(3) ); 
seats_.push_back(new Seat(4) ); 
seats_.push_back(new Seat(5) ); 
seats_.push_back(new Seat(6) ); 
seats_.push_back(new Seat(7) ); 
seats_.push_back(new Seat(8) ); 
seats_.push_back(new Seat(9) ); 

 
 
std::vector<Seat *> seats_; 
 
 
Seat * get( const int seat ) 

return seats_.at(seat - 1); 

 
 
public: 
class Iterator  

friend class CycleIterator; 
public: 
typedef size_t size_type; 
typedef ptrdiff_t difference_type; 
 
 
typedef std::forward_iterator_tag iterator_category; 
typedef Seat *        value_type; 
typedef Seat **           pointer; 
typedef Seat *&         reference; 
 
 
Iterator(Table * table, const int position):table_(table), position_(position) {} 
 
 
Iterator(const Iterator & it):table_(it.table_), position_(it.position_) {} 
 
 
Iterator operator ++() 

for (++position_; position_ <= Table::END_SEAT;++position_ ) 

//if (table_->get(position_)->visible_ == true)  

return Iterator(table_, position_); 


 
 
position_ = Table::INVALID_SEAT; 
 
 
return Iterator(table_, Table::INVALID_SEAT); 

 
 
Seat * operator ->() 

return table_->get(position_); 

 
 
Seat * operator *() 

return table_->get(position_); 

 
 
bool operator == (const Iterator & it)const 

return position_ == it.position_; 

 
 
bool operator != (const Iterator & it)const 

return position_ != it.position_; 

 
 
private: 
Table * table_; 
 
 
int position_; 
}; 
 
 
public: 
Iterator begin() 

return Iterator(this, BEGIN_SEAT); 

 
 
Iterator end() 

return Iterator(this, INVALID_SEAT); 

}; 
 
 
bool FindNullSeat(Seat *  seat) 

return seat->no_ == 3; 

 
 
int main(int , char **) 

Table table; 
Table::Iterator seat = std::find_if(table.begin(), table.end(), FindNullSeat); 
 
 
return 0; 

#include <vector>
#include <algorithm>

class Seat
{
public:
Seat(int no):no_(no) {}
int no_;
};


class Table
{
static const std::size_t BEGIN_SEAT = 1;
static const std::size_t INVALID_SEAT = 0;
static const std::size_t END_SEAT = 9;
public:
Table()
{
seats_.push_back(new Seat(1) );
seats_.push_back(new Seat(2) );
seats_.push_back(new Seat(3) );
seats_.push_back(new Seat(4) );
seats_.push_back(new Seat(5) );
seats_.push_back(new Seat(6) );
seats_.push_back(new Seat(7) );
seats_.push_back(new Seat(8) );
seats_.push_back(new Seat(9) );
}


std::vector<Seat *> seats_;


Seat * get( const int seat )
{
return seats_.at(seat - 1);
}


public:
class Iterator
{
friend class CycleIterator;
public:
typedef size_t size_type;
typedef ptrdiff_t difference_type;


typedef std::forward_iterator_tag iterator_category;
typedef Seat *        value_type;
typedef Seat **           pointer;
typedef Seat *&         reference;


Iterator(Table * table, const int position):table_(table), position_(position) {}


Iterator(const Iterator & it):table_(it.table_), position_(it.position_) {}


Iterator operator ++()
{
for (++position_; position_ <= Table::END_SEAT;++position_ )
{
//if (table_->get(position_)->visible_ == true)
{
return Iterator(table_, position_);
}
}


position_ = Table::INVALID_SEAT;


return Iterator(table_, Table::INVALID_SEAT);
}


Seat * operator ->()
{
return table_->get(position_);
}


Seat * operator *()
{
return table_->get(position_);
}


bool operator == (const Iterator & it)const
{
return position_ == it.position_;
}


bool operator != (const Iterator & it)const
{
return position_ != it.position_;
}


private:
Table * table_;


int position_;
};


public:
Iterator begin()
{
return Iterator(this, BEGIN_SEAT);
}


Iterator end()
{
return Iterator(this, INVALID_SEAT);
}
};


bool FindNullSeat(Seat *  seat)
{
return seat->no_ == 3;
}


int main(int , char **)
{
Table table;
Table::Iterator seat = std::find_if(table.begin(), table.end(), FindNullSeat);


return 0;
}

 

补充:软件开发 , C++ ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,