c++ - 存储迭代器的 iterator_category 应该是什么?
问题描述
语境:
我正在尝试构建一个容器,它将充当运行时定义维度的多维数组的包装器 - 事实上,底层数组当然是总大小的一维数组。主要部分是operator []
返回子数组的包装器。
由于容器需要迭代器,我目前正在该容器上实现迭代器,包括Container::iterator
和Container::const_iterator
. 我努力模仿标准容器迭代器,并且我的实现几乎满足了随机访问迭代器的所有要求,除了:
前向迭代器 [forward.iterators]
...
6如果a
和b
都是可解引用的,那么a == b
当且仅当*a
和*b
被绑定到同一个对象。
不尊重它的原因是operator *
必须返回对子容器的引用。所以我的实现是一个存储迭代器,它包含一个随迭代器移动的子容器成员,并operator *
返回对该成员对象的引用
过度简化的实现:
template <class T>
class SubArray {
T *arr;
size_t *sizes;
size rowsize;
public:
...
Iterator<T> begin() {
return Iterator<T>(operator[](0));
}
...
};
class Iterator<T> {
SubArray elt;
public:
Iterator(const SubArray<T>& pos): elt(pos) {}
...
SubArray<T>& operator *() {
return elt;
...
};
根据 cppreference (以及不同实现的来源)std::filesystem::path::iterator
也是一个存储迭代器。
问题
迭代器的iterator_category
成员应该帮助其他类识别从输入迭代器到随机访问的迭代器类型。iterator_category
我的存储迭代器应该是什么,它满足了随机访问迭代器的几乎所有要求,但对于一个前向迭代器却失败了?注意:这足以使其std::reverse_iterator
无法使用。
评论:
我可以确认std::filesystem::path::iterator
包含用于 Clang 实现:
typedef bidirectional_iterator_tag iterator_category;
也是防止std::reverve_iterator
尝试使用它的标记
参考:
- 我在Code Review上的容器类的完整源代码
- 关于SO
std::reverse_iterator
上的存储容器的问题 std::reverse_iterator
在cppreference上(参见示例代码上方的注释)
解决方案
推荐阅读
- ubuntu - Wayland + Terminator + Quake 模式
- rust - 如何使用 structopt 将 possible_values 附加到结构?
- python - 在 python 上求解一个复杂的隐式方程
- angular - 发生错误时如何跳出循环
- r - 将图表中的类间隔放在直方图中,例如作为图例
- python - Kivy App 未针对 iPhone X、Xs 和 Xs Max 进行优化
- amazon-ecs - ECS fargate 健康检查问题
- foreign-keys - 如何使用 Fluent API 指定外键引用的主体实体?
- swift - 滑动标题视图与 tableview 单元格相同
- java - 为什么我会收到越界异常错误?