c++ - 在双向链接的循环列表/环中实现迭代器(.end() 的问题)
问题描述
我正在尝试Iterator
在我的班级中实现BiRing<Key, Info>
班级。
我想知道的是如何实现一个遍历环的所有元素的迭代器?我已经在互联网上搜索了解决方案,但我无法找到任何相关的解决方案。
我遇到的主要困难是如何处理.end()
方法。我读过它是通过返回最后一个元素的伪下一个元素来实现的,但我还没有看到任何关于如何在任何自定义容器上执行此操作的指南,更不用说双链接环了。
谁能简要解释一下在一般情况下和我的情况下如何创建这些伪最后元素,是否有其他方法可以实现迭代器,以便我能够遍历环的所有元素?
我的课(简体):
template<typename Key, typename Info>
class BiRing
{
private:
struct Node
{
// key and info, previous and next, constructor
};
Node* any;
public:
struct Iterator
{
private:
Node* iter;
public:
Iterator(Node* any) : iter(any) {}
void operator++() {
if (iter == nullptr) throw ("nullptr iterator");
iter = iter->next;
}
// *, == and != operators
};
Iterator begin() { return Iterator(any); }
//Iterator end() { return ??? }
// other methods
};
更新:
意识到“伪最后一个元素”的字面意思是“在不同上下文中处理方式不同的另一个节点”,我通过添加一个名为pseudoLast
.
其余的课程BiRing
并Iterator
跟进该逻辑。每个Iterator
对象都有Node* ptr
并且Node* toSkip
随后允许我检查迭代器对象是否与正确的BiRing
对象一起使用;例如,如果我将 biRing begin()/end() 与不属于该对象的迭代器进行比较, == 和 != 运算符将引发异常。
如果有人想查看我是如何实现它的: Pastebin 链接。
解决方案
推荐阅读
- javascript - 想要将单选和复选框值从一种形式转移到另一种形式
- react-native - 反应原生选项卡导航器切换按钮snipples?
- javascript - 从画布中获取 webgl 纹理
- bash - `git clone` 到 $GOPATH 没有`go get`?
- java - 在 kotlin 中使用 java 自定义注解
- julia - 如何在 Julia 中查找和替换 AST 的子表达式
- c# - 如何从 lambda 函数访问 S3 存储桶中的文件
- spring - Spring Batch:如何设置 FlatFileItemReader 来读取 json 文件?
- php - SMTP:客户端:535 5.7.3 身份验证不成功
- python - 将数字的最后 n 位转换为零