迭代器算术类型

时间:2015-04-27 01:14:57

标签: c++

我看到很多人决定签名int,但在我看来,这似乎是出于无知,因为这会导致使用无符号size_type的容器类型的签名/未签名不匹配。

由于无法获得所提供迭代器的容器类型,因此我没有办法让假定容器的size_type执行准确的算术运算。

在迭代器上执行算术运算时,我们应该使用什么类型?或者更好的是,如果迭代器不知道它们的父容器,怎么能得到容器的底层size_type

EDIT2:

基础尺寸类型的含义是,例如:

std::vector<some_type>::size_type

对于某些容器类型为std::vector<some_type>

的迭代器

EDIT1:

我认为C ++ 17通过一些容器访问功能提供了解决这个问题的方法:

这些非成员函数为容器,普通数组和std :: initializer_list提供了通用接口。

  • (函数)size(C ++ 17)返回容器或数组的大小
  • (function)empty(C ++ 17)检查容器是否为空
  • (函数)数据(C ++ 17)获取指向底层数组的指针

更具体地说,size给出父容器的size字段的声明类型。

1 个答案:

答案 0 :(得分:4)

我的建议是使用std::iterator_traits<It>::difference_typeIt是迭代器类型),这通常是(但不是强制要求的)std::ptrdiff_tstd::ptrdiff_t签名类型的别名。

由于以下事实,我建议这样做:

  1. std::distance返回std::iterator_traits<It>::difference_type
  2. std::nextstd::prevstd::iterator_traits<It>::difference_type作为参数。
  3. 双向迭代器的算法可能会反转。