指針的使用沒有指針的字面含義。拿下一節鹽。STL如何使用非線性數據結構實現反向迭代器解引用?
很容易實現一個反向迭代器,使用線性數據結構創建rbegin()== end()和rend()== begin(),因爲您可以將反向訪問映射到元素的前面,迭代器指向(rbegin()指向end(),但訪問結束() - 1)。但是在處理樹或者在我的情況下,散列表時,我應該如何處理這個映射?我目前使用「OneAfterTheLast」標誌來標記轉發迭代會話的結束,我正在考慮手動實現反向迭代器邏輯並添加一個「OneBeforeTheFirst」標誌。這是一個很好的設計嗎?另外,find()方法應該在沒有找到關鍵字的情況下返回一個「OneAfterTheLast」迭代器,或者我的檢查方法是否應該檢查兩個標誌(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);
需要注意的是標準不要求所有的容器是可逆的。特別是,C++ 11標準中的無序容器(如'unordered_map',基本上是一個哈希表)只需要支持前向迭代器,因此不需要是可逆的。 – 2012-07-13 21:40:53
大大增加了這件事。不幸的是,該項目需要雙向迭代器,所以我認爲支持預留迭代器也會很好。 – Spidey 2012-07-13 21:52:34
一旦你有了一個雙向迭代器,你就實現了'reverse_iterator'所需的基本功能。實際上,你應該能夠使用'std :: reverse_iterator <>'來提供你的容器的反向迭代器。 – 2012-07-13 22:30:42