我正在尝试构建一个容器,它将作为运行时定义维度的多维数组的包装器 - 实际上底层数组当然是总大小的一维数组。主要部分是operator []
返回子数组的包装器。
由于容器需要迭代器,我目前正在该容器上实现迭代器,Container::iterator
和Container::const_iterator
。我努力模仿标准容器迭代器,我的实现几乎满足随机访问迭代器的所有要求,除了:
转发迭代器[forward.iterators]
...
6 如果a
和b
都可以取消引用,则a == b
当且仅当*a
和*b
绑定到同一个对象。
不尊重它的原因是operator *
必须返回对子容器的引用。所以我的实现是一个 stashing iterator ,它包含一个随迭代器一起移动的子容器成员,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
尝试使用它的标记
std::reverse_iterator
的问题
std::reverse_iterator
在cppreference上(请参阅示例代码上方的说明)