Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/128.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么std::count返回有符号整数?_C++_Types_Containers_C++ Standard Library - Fatal编程技术网

C++ 为什么std::count返回有符号整数?

C++ 为什么std::count返回有符号整数?,c++,types,containers,c++-standard-library,C++,Types,Containers,C++ Standard Library,我非常惊讶地看到std::count返回了一个迭代器\u traits::difference\u type,它在我的平台上依次引用了一个long int 为什么呢?容器中元素的负计数没有任何意义。它实际上是一个,必须是一个有符号整数。必须对其进行签名,因为它可以用作两个迭代器之间的差值,这当然可以是负数。只有当范围无效时,差值才会是负数,这会在算法过程中产生未定义的行为。此讨论可能会有所帮助:@ChristianIvicevic,我很困惑。这是否是未定义的行为?我的意思是,要么检查迭代器边界,

我非常惊讶地看到
std::count
返回了一个
迭代器\u traits::difference\u type
,它在我的平台上依次引用了一个
long int


为什么呢?容器中元素的负计数没有任何意义。

它实际上是一个,必须是一个有符号整数。必须对其进行签名,因为它可以用作两个迭代器之间的差值,这当然可以是负数。

只有当范围无效时,差值才会是负数,这会在算法过程中产生未定义的行为。此讨论可能会有所帮助:@ChristianIvicevic,我很困惑。这是否是未定义的行为?我的意思是,要么检查迭代器边界,它在出错时返回负值,要么它是未定义的行为,然后它返回的是未定义的。请参考Joachim的回答-
std::count
只返回两个迭代器之间的距离,如果选择了无效的范围,当然可以是负值。在这种情况下,未定义的行为是从n+1到n进行计数。这将如何工作?这取决于所使用的类型和迭代器。“容器中的元素计数为负数没有任何意义。”-您似乎即将建议在不可能出现负值的地方“应该”使用无符号类型。有很多经验丰富的C++程序员(C)会强烈反对这个建议。您似乎还将讨论限制在容器上。迭代器不仅用于迭代容器,还可以迭代其他内容,尽管不管迭代什么,负数是没有意义的。该死的,我应该写个答案而不是评论。。。但是,是的,那是对的。所以下一个问题是,为什么他们用std::ptrdiff_t来表示std::count,这在另一篇文章中得到了回答。所以,谢谢。@qdii
std::iterator\u traits::difference\u type
与迭代器
difference\u type
相同,迭代器默认为
ptrdiff\u t
(如图所示)。为什么将距离指定为
ptrdiff\u t
,可能是因为迭代器可以像指针一样使用,但(C++11)规范实际上没有给出原因,它只是指定它必须是那种类型。@JoachimPileborg:我原以为
difference\u type
默认为
ptrdiff\u t
的原因是指针减法会导致
ptrdiff\u t
。所以
迭代器特征::difference\u type
必须是
ptrdifff_t
,迭代器的默认值是指针的默认值,这是有意义的。不过,我可能缺少一些原因,您需要一个更强有力的解释。