どうすればこれを適切に行うことができるのか少し困惑していますが、テンプレートを使用して、実装している二分探索ツリー クラス内で反復子をインクリメントできるようにする必要があります。
イテレータの構造には、現在のノードと、現在の位置を定義する整数があります。私が抱えている唯一の問題は、++Iter
操作を行うときに、右または左に移動する必要があるかどうかをどのように判断する必要があるかということです。
クラス全体のヘッダー ファイルは次のとおりです。
template < typename TComparable, typename TValue >
class SearchTree
{
public:
class Iterator;
private:
struct Node;
typedef typename Node TNode;
public:
SearchTree( void );
~SearchTree( void );
public:
TValue find( const TComparable& k );
TValue find( int32_t index );
TValue find( const Iterator& pIter );
Iterator begin( void ) const;
Iterator end( void ) const;
void insert( const TComparable& k, const TValue& v );
void insert( const Iterator& pIter );
friend class Iterator;
friend class TNode;
private:
int32_t mNodeCount;
TNode* mRoot;
public:
class Iterator
{
public:
Iterator( void );
Iterator( int32_t position );
~Iterator( void );
inline TNode* operator->( void ) const
{ return mCurrentNode; }
void operator++( void );
bool operator==( const Iterator& pIter );
bool operator!=( const Iterator& pIter );
private:
int32_t getNumStepsLeftToLeaf( void );
int32_t getNumStepsRightToLeaf( void );
bool isLeafNode( const Node*& n );
bool isInternalNode( const Node*& n );
private:
TNode* mCurrentNode;
int32_t mIterPosition;
friend class TNode;
};
private:
struct Node
{
public:
Node( void ) : mParent( NULL ), mLeftChild( NULL ), mRightChild( NULL )
{}
~Node( void )
{
if ( mParent ) delete mParent;
if ( mLeftChild ) delete mLeftChild;
if ( mRightChild ) delete mRightChild;
}
int32_t index;
TComparable Key;
TValue Value;
TNode* mParent;
TNode* mLeftChild;
TNode* mRightChild;
};
};
このコードの多くをAndroid NDKに移植する予定なので、これには例外を使用できないことに注意してください.STLportで例外を使用できないと思います(これを使用します.私はやっています (これは営利目的です) 私はそれを使うことができません - 誰かがそれを否定する何かを持っているなら、私に知らせてください)
また、誰かがブーストについて言及する前に、私はすでにそれを NDK に移植しようとしましたが、成功しませんでした。私はそれを使いたいと思っています.
イテレータに関しては、ここで私のデザインに何かが欠けていると思います。誰かがこれが何であるかを知っているなら、私に知らせてください。誰かがそれを必要とする場合は、このクラス全体のソースも投稿していただければ幸いです。