我看到很多人决定签名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给出父容器的size字段的声明类型。
答案 0 :(得分:4)
我的建议是使用std::iterator_traits<It>::difference_type
(It
是迭代器类型),这通常是(但不是强制要求的)std::ptrdiff_t
。 std::ptrdiff_t
是签名类型的别名。
由于以下事实,我建议这样做:
std::distance
返回std::iterator_traits<It>::difference_type
。std::next
和std::prev
将std::iterator_traits<It>::difference_type
作为参数。