在没有指针字面意义的情况下使用指向。用一粒盐来看待下一段。
实现反向迭代器很容易,使 rbegin() == end() 和 rend() == begin() 具有线性数据结构,因为您可以将反向访问映射到迭代器指向之前的元素( rbegin() 指向 end(),但访问 end()-1,例如)。但是在处理树或者在我的情况下是哈希表时,我应该如何处理这个映射?我目前正在使用“OneAfterTheLast”标志来标记转发迭代会话的结束,并且我正在考虑手动实现反向迭代器逻辑并添加一个“OneBeforeTheFirst”标志。这是一个好的设计吗?
此外,在找不到密钥的情况下,find() 方法应该返回一个“OneAfterTheLast”-ed 迭代器,还是我的检查方法应该检查两个标志(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);