2011-07-12 16 views
6

これは、Cfooのユーザが内部を変更することなくコンテナを反復することを可能にするSTLコンテナのかなり通常のカプセル化です。カプセル化されたネストされたSTLコンテナを反復する

#include <vector> 

class Cfoo 
{ 
public: 
    class Cbar 
    { 
     /* contents of Cbar */ 
    }; 
    typedef std::vector<Cbar> TbarVector; 
    typedef TbarVector::const_iterator const_iterator;  
public: 
    const_iterator begin() const { return(barVector_.begin()); } 
    const_iterator end() const { return(barVector_.end()); } 
private: 
    TbarVector barVector_; 
}; 

これまでのところ、とても良いです。

Cfoo myFoo; 
for (Cfoo::const_iterator it = myFoo.begin(); it != myFoo.end(); ++it) 
{ 
    it->DoSomething(); 
} 

は、今私は、ネストされたのstd ::ベクトル言うとはstd ::ベクトルを交換したい:私たちは、このようにコンテナを繰り返すことができ

public: 
    typedef std::vector<Cbar> TbarVectorInner; 
    typedef std::vector<TbarVectorInner> TbarVectorOuter; 

private: 
    TbarVectorOuter barContainer_; 

をしかし、私は反復処理することができるようにしたいです以前と同じ方法でCbarのすべてのインスタンスを作成し、const_iteratorとbegin()constメソッドとend()constメソッドを公開します。

私はカスタムイテレータを書くことが関係しているとは思うが、私はそれを行う方法がわからない。何かご意見は?

+1

カスタムイテレータの作成が必要です。 –

+2

http://tackoverflow.com/questions/3623082/flattening-iteratorからのFlattening Iteratorのようなサウンド – Cubbi

+0

「TbarVector」はプライベートである必要があります。外部との関連性がなく、誤用されやすいことを外部に伝えます。 –

答えて

4

標準のイテレータは、複数のコンテナで繰り返し処理することはできません。したがって、あなたの前提は正しいです。カスタムイテレータを作成する必要があります。

内部コンテナに(開始、終了)イテレータのペアを返す中間イテレータがある場合は、これを汎用の方法で行うことができます。

始めるためにいくつかの未テストコード: - すでにthis implementationによっては同じ地面をカバーしていない、または

template<typename T, typename OuterIterator, typename InnerIterator> 
class Iterator2d : std::Iterator 
{ 
public: 
    Iterator2d(OuterIterator begin, OuterIterator end) : m_begin(begin), m_end(end), m_currentOuter(begin) { 
     if (m_currentOuter != m_end) 
      m_currentInner = m_begin->first; 
     Normalize(); 
    } 
    Iterator2d & operator++() 
    { 
     if (m_currentOuter != m_end) 
     { 
      ++m_currentInner; 
      Normalize(); 
     } 
     return *this; 
    } 
    T & operator*() 
    { 
     return *m_currentInner; 
    } 
private: 
    void Normalize() 
    { 
     while (m_currentOuter != m_end && m_currentInner == m_currentOuter->second) 
     { 
      ++m_currentOuter; 
      if (m_currentOuter != m_end) 
       m_currentInner = m_currentOuter->first; 
     } 
    } 

    OuterIterator m_begin; 
    OuterIterator m_end; 
    OuterIterator m_currentOuter; 
    InnerIterator m_currentInner; 
}; 

これは単なるスタートですが、私はそれを完了するために戻ってくることがあります。

+0

'演算子++()'逃した 'return * this' – teivaz

+0

@teivazありがとう、固定されています。 –

関連する問題