C++ 如果返回有符号值而不是无符号值,为什么std::count_?

C++ 如果返回有符号值而不是无符号值,为什么std::count_?,c++,stl,standard-library,stl-algorithm,C++,Stl,Standard Library,Stl Algorithm,刚刚意识到std::count\u if 为什么它是这样设计的?在我看来,这毫无意义(结果只能是一个自然数,即非负整数),因为它不允许在没有得到警告或使用显式类型转换的情况下,将此结果与容器的size()进行简单的比较 我真的认为返回类型应该有size\u-type 我遗漏了什么吗?我认为返回类型的目的是与std::count兼容,后者使用两个迭代器(想想指针)并返回中间的值(你可以认为是两个指针的差异)。指针差(如ptrdiff\u t中所用)必须是有符号值 由于与std::count兼容,您

刚刚意识到std::count\u if

为什么它是这样设计的?在我看来,这毫无意义(结果只能是一个自然数,即非负整数),因为它不允许在没有得到警告或使用显式类型转换的情况下,将此结果与容器的
size()
进行简单的比较

我真的认为返回类型应该有
size\u-type


我遗漏了什么吗?

我认为返回类型的目的是与
std::count
兼容,后者使用两个迭代器(想想指针)并返回中间的值(你可以认为是两个指针的差异)。指针差(如
ptrdiff\u t
中所用)必须是有符号值

由于与
std::count
兼容,您可以轻松比较这两个函数的结果


编辑:此处使用带符号的值不存在与范围相关的缺点,因为该值至少在范围
[0,std::count]
内,而该范围本身也在范围
[0,end\u ptr-start\u ptr]
内。因为
end\u ptr-start\u ptr
类型为
ptrdiff\u t
或类似类型,所以它是有符号的。

对于
count
返回迭代器的
difference\u type
,这是有意义的,因为它几乎就是参数的差异,如果
count>则保留该接口是有意义的,对于双向迭代器,对
difference\u type
进行签名也同样有意义。同样,为什么不能在固定时间内拆分两个
std::list
s?@WojciechFrohmberg:Simple,您需要对元素进行计数。创建后的列表有O(1)
.size()
,这意味着它是缓存的,@MSalters但您可以将位置存储在迭代器中,用于拆分列表,并且可以摊销…@WojciechFrohmberg:您如何保持该位置的最新状态?请记住,您可以在列表上调用
push_front
,而不会使现有迭代器无效,显然,这会将所有现有迭代器的位置更改1.5%。
std::count
描述清楚地说:“返回范围[first,last]中比较等于val的元素数。”元素数不能为负数。
count
参数的类型(迭代器)完全不相关。@VioletGiraffe:是的。元素的数量不能是负数。但是
count
count\u if
的签名都包含迭代器。我没有说定义一些有符号的元素是有意义的。。。