ポインティングは、ポインターの文字通りの意味なしで使用されます。次の段落を一粒の塩で取ってください。
rbegin() == end() と rend() == begin() を線形データ構造で作成して、逆イテレータを実装するのは簡単です。これは、イテレータが指している直前の要素への逆アクセスをマップできるためです ( rbegin() は end() を指しますが、たとえば end()-1 にアクセスします)。しかし、ツリー、または私の場合はハッシュ テーブルを扱う場合、このマッピングをどのように処理すればよいでしょうか? 私は現在、「OneAfterTheLast」フラグを使用して、転送反復セッションの終了をマークしています。逆反復子ロジックを手動で実装し、「OneBeforeTheFirst」フラグも追加することを考えています。それは良いデザインですか?
また、find() メソッドは、キーが見つからない場合に "OneAfterTheLast" 編集されたイテレータを返す必要がありますか、それとも check メソッドで両方のフラグ (OneAfterTheEnd と OneBeforeTheFirst) をチェックする必要がありますか?
これが私の公開インターフェースです。参考までに、まだリバース イテレータ メソッドを使用していません。コンテナ クラスとイテレータ クラスはどちらも不透明です。
typedef PWError (*PWDictCallback)(const char *key, const char *val, void *extra);
PWError pwdictCreate(PWDict **dictRef, PWDictImplementationId id, size_t elements);
PWError pwdictCreateWithImplementation(PWDict **dictRef, const PWDictImplementation* impl, size_t elements);
void pwdictDestroy(PWDict *dict);
unsigned int pwdictSize(const PWDict *dict);
unsigned long pwdictSizeInBytes(const PWDict *dict);
PWError pwdictGet(const PWDict *dict, const char *key, char *output, size_t size);
PWError pwdictSet(PWDict *dict, const char *key, const char *value);
PWError pwdictRemove(PWDict *dict, const char *key);
PWError pwdictIteratorCreate(PWDictIterator **itRef, PWDict *dict);
PWError pwdictIteratorBegin(PWDictIterator *it);
int pwdictIteratorIsEnd(PWDictIterator *it);
void pwdictIteratorDestroy(PWDictIterator *it);
PWError pwdictFind(PWDictIterator *it, const char *key);
const char *pwdictIteratorGetKey(const PWDictIterator *it);
const char *pwdictIteratorGetValue(const PWDictIterator *it);
PWError pwdictIteratorSetValue(PWDictIterator *it, const char *value);
PWError pwdictIteratorRemove(PWDictIterator *it);
PWError pwdictIteratorNext(PWDictIterator *it);
PWError pwdictClear(PWDict *dict);
PWError pwdictAdd(PWDict *dict, const PWDict *from);
int pwdictIsEqual(const PWDict *d1, const PWDict *d2);
PWError pwdictForeach(PWDict *dict, PWDictCallback cb, void *extra);
void pwdictPrint(const PWDict *dict, int logLevel);