鱼C论坛

 找回密码
 立即注册
查看: 2634|回复: 0

[技术交流] 浅析iterator

[复制链接]
发表于 2014-3-7 20:28:38 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 andalousie 于 2014-3-7 20:30 编辑

声明一下,这不是在实现<vector>库,而是基于C++的vector给出一个iterator方法。vc6.0/g++编译通过。第一个版本:
  1. #include <iostream>
  2. #include <vector>
  3. using namespace std;

  4. template <class Object>
  5. class VectorIterator;

  6. // Same as the vector, but has a getIterator method.
  7. // No extra data, no overridden methods, so non-virtual
  8. // destructor in original vector is OK!
  9. template <class Object>
  10. class MyVector : public vector<Object>
  11. {
  12.   public:
  13.     explicit MyVector( int size = 0 )
  14.       : vector<Object>( size ) { }

  15.     VectorIterator<Object> getIterator( ) const
  16.       { return VectorIterator<Object>( this ); }
  17. };

  18. // A passive iterator class. Steps through its MyVector.
  19. template <class Object>
  20. class VectorIterator
  21. {
  22.   public:
  23.     VectorIterator( const MyVector<Object> *v )
  24.       : owner( v ), count( 0 ) { }

  25.     bool hasNext( ) const
  26.       { return count != owner->size( ); }

  27.     const Object & next( )
  28.       { return (*owner)[ count++ ]; }

  29.   private:
  30.     const MyVector<Object> *owner;
  31.     int count;
  32. };

  33. int main( )
  34. {
  35.     MyVector<int> v;

  36.     v.push_back( 3 );
  37.     v.push_back( 2 );

  38.     cout << "Vector contents: " << endl;

  39.     VectorIterator<int> itr = v.getIterator( );
  40.     while( itr.hasNext( ) )
  41.         cout << itr.next( ) << endl;

  42.     return 0;
  43. }
复制代码
注意,这里我们的itr不再表现为指针的样子,类似Java的方法。
第二个版本:
class MyVector内容不做改变,增加VectorIterator的方法。
  1. ...
  2. // A passive iterator class. Steps through its MyVector.
  3. template <class Object>
  4. class VectorIterator
  5. {
  6.   public:
  7.     VectorIterator( const MyVector<Object> *v )
  8.       : owner( v ), count( 0 ) { }

  9.     void reset( )
  10.       { count = 0; }

  11.     bool isValid( ) const
  12.       { return count < owner->size( ); }

  13.     void advance( )
  14.       { count++; }

  15.     const Object & retrieve( ) const
  16.       { return (*owner)[ count ]; }

  17.   private:
  18.     const MyVector<Object> *owner;
  19.     int count;
  20. };


  21. int main( )
  22. {
  23.     MyVector<int> v;

  24.     v.push_back( 3 );
  25.     v.push_back( 2 );
  26.     VectorIterator<int> itr = v.getIterator( );

  27.     for( int i = 0; i < 2; i++ )
  28.     {
  29.         cout << "Vector contents: " << endl;
  30.         for( itr.reset( ); itr.isValid( ); itr.advance( ) )
  31.             cout << itr.retrieve( ) << endl;
  32.     }

  33.     return 0;
  34. }
复制代码
第三个版本:基于继承的迭代器
  1. ...
  2. template <class Object>
  3. class Iterator;

  4. template <class Object>
  5. class VectorIterator;

  6. // Same as the vector, but has a getIterator method.
  7. // No extra data, no overridden methods, so non-virtual
  8. // destructor in original vector is OK!
  9. template <class Object>
  10. class MyVector : public vector<Object>
  11. {
  12.   public:
  13.     explicit MyVector( int size = 0 )
  14.       : vector<Object>( size ) { }

  15.     Iterator<Object> *getIterator( ) const
  16.       { return new VectorIterator<Object>( this ); }
  17. };


  18. // A passive iterator class protocol. Steps through its container.
  19. template <class Object>
  20. class Iterator
  21. {
  22.   public:
  23.     virtual ~Iterator( ) { }

  24.     virtual bool hasNext( ) const = 0;
  25.     virtual const Object & next( ) = 0;
  26. };

  27. // A concrete implementation of the iterator.
  28. // Could have been nested inside of MyVector!
  29. template <class Object>
  30. class VectorIterator : public Iterator<Object>
  31. {
  32.   public:
  33.     VectorIterator( const MyVector<Object> *v )
  34.       : owner( v ), count( 0 ) { }

  35.     bool hasNext( ) const
  36.       { return count != owner->size( ); }

  37.     const Object & next( )
  38.       { return (*owner)[ count++ ]; }

  39.   private:
  40.     const MyVector<Object> *owner;
  41.     int count;
  42. };


  43. int main( )
  44. {
  45.     MyVector<int> v;

  46.     v.push_back( 3 );
  47.     v.push_back( 2 );

  48.     cout << "Vector contents: " << endl;

  49.     Iterator<int> *itr = v.getIterator( );
  50.     while( itr->hasNext( ) )
  51.         cout << itr->next( ) << endl;

  52.     delete itr;

  53.     return 0;
  54. }
复制代码
缺点:由于*itr是动态分配的,所以需要delete
大家如果不放心,用auto_ptr也可以。
就是36行改成
  1.     auto_ptr<Iterator<Object> > getIterator( ) const
  2.       { return auto_ptr<Iterator<Object> >(new VectorIterator<Object>( this )); }
复制代码
82行改成
  1.     auto_ptr<Iterator<int> > itr = v.getIterator( );
复制代码
就可以了。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-4-18 02:48

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表