有没有一个迭代器的例子,它不会使用 ptrdiff_t 作为其difference_type?
Is There an Example of an Iterator Which Wouldn't use ptrdiff_t as its difference_type?
我看到iterator_traits
总是定义一个difference_type
: https://en.cppreference.com/w/cpp/iterator/iterator_traits#Member_types
我只是想知道为什么,这不是每种类型都ptrdiff_t
吗?有没有不使用ptrdiff_t
的迭代器的例子?如果不是,为什么difference_type
没有从iterator_traits
中消除并ptrdiff_t
到处使用?
我编写了一个绳索类型,可以处理大于潜在内存的后备存储(也就是说,即使在 32 位代码中,它也可以处理 64 位序列(。因此,我必须使用 64 位大小和差异类型,无论它是以 32 位还是 64 位模式编译。
一个基本的输出迭代器,以std::ostream_iterator
为例,可能根本不需要差分类型。
由于它意味着"即发即弃"的迭代器,因此在两个这样的迭代器之间获得差异通常没有多大意义。仅仅写到一份副本的行为就可能使所有其他副本无效。因此,它不需要定义差分类型,也不应该强制人为地这样做(或强制类型(。
理论上,任何差异不能用std::ptrdiff_t
表示的迭代器。例如,考虑以下玩具迭代器,它给定方向,导航 2D 矩阵:
template<typename T>
struct vec2d {T x; T y;};
template<typename T, typename C>
class cartesian_iterator {
public:
using value_type = T;
// because the difference between 2d vectors is an actual 2d vector,
// we can't use std::ptrdiff_t
using difference_type = vec2d<int>;
cartesian_iterator(C* container, vec2d<size_t> position, difference_type increment = difference_type{1,1})
: container{container}, position{position}, increment{increment}
{}
cartesian_iterator& operator++() {position.x += increment.x; position.y += increment.y; return *this;}
bool operator==(const cartesian_iterator& rhs) {return position.x == rhs.position.x && position.y == rhs.position.y;}
bool operator!=(const cartesian_iterator& rhs) {return position.x != rhs.position.x || position.y != rhs.position.y;}
T& operator*() {
return (*container)[position.x][position.y];
}
// difference could be implemented like this
difference_type operator-(const cartesian_iterator& rhs) {
return {
static_cast<int>(position.x) - static_cast<int>(rhs.position.x),
static_cast<int>(position.y) - static_cast<int>(rhs.position.y),
};
}
private:
C* container;
vec2d<size_t> position;
difference_type increment{1,1};
};
用法:
// outputs 159
int main() {
using std::array;
array<array<int, 3>, 3> a {
1,2,3,
4,5,6,
7,8,9
};
cartesian_iterator<int, array<array<int, 3>, 3>> it{&a, {0, 0}};
while (it != decltype(it){&a, {3,3}}) {
std::cout << *it;
++it;
}
}
相关文章:
- 使用 [] 运算符时"binding reference of type discards qualifiers"
- 在 QVector<std::unique_ptr 上使用 std::find<Type>>
- 在类型和包装器之间reinterpret_cast是否安全<Type>?
- 使用 cmake 的 Linux 终端上的"Conversion to non-scalar type is requested"错误
- 控制到达非空函数clang(-Wreturn-type)的末尾
- std::unordered_map 类型对象声明期间出现"field has incomplete type"错误
- 将系数存储在头文件的数组中("does not name a type"错误)
- 尝试打开 ifstream 时出现"Incomplete type"错误
- 将成员函数作为构造函数参数调用时出错 "Variable is not a type name"
- 在"结构提升::enable_if<提升::is_pod<T>,无效>"中没有名为"type"的类型
- "Missing type specifier - int assumed"无法通过向主函数添加"return 0"来解决
- OpenCV CV_16F type
- C++ "错误:在'类 std::result_of< ... >"中没有名为'type'的类型"
- 将内存分配返回值强制转换为 TYPE 数组
- C++ 一个lambda浅拷贝const Type&如果它被赋予一个命名捕获,如[copy=val](){}?
- reference_wrapper导致"incomplete type is not allowed"
- 继承类时"invalid use of incomplete type ‘class tree_node_t’"
- 由于"error C4430: missing type specifier - int assumed. Note: C++ does not support default-int",我现在无法编
- 如何解决"'mutex' in namespace 'std' does not name a type"?
- 结构中的错误"Incomplete type is not allowed"