【问题标题】:Why does std::count_if return signed value instead of unsigned? [duplicate]为什么 std::count_if 返回有符号值而不是无符号值? [复制]
【发布时间】:2015-05-11 14:49:57
【问题描述】:

刚刚意识到std::count_if returns a signed value

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

我真的认为返回类型应该是size_type

我错过了什么吗?

【问题讨论】:

  • 返回 count 的迭代器的 difference_type 是有意义的,因为它几乎只是参数的差异,因此保留 count_if 的接口是有意义的,为双向迭代器签名difference_type 同样有意义。
  • 同样,为什么一个人不能在恒定时间内拆分两个std::lists?
  • @WojciechFrohmberg:很简单,你需要计算元素。一旦创建的列表有 O(1) .size() 这意味着它被缓存了,
  • @MSalters 但是您可以将位置存储在可用于拆分列表的迭代器中,以便可以摊销......
  • @WojciechFrohmberg:您将如何保持当前的立场?请记住,您可以在列表上调用 push_front 而不会使现有迭代器失效,显然这确实会将所有现有迭代器的位置更改一个。

标签: c++ stl standard-library stl-algorithm


【解决方案1】:

我认为返回类型旨在与std::count 兼容,它接受两个迭代器(想想指针)并返回它们之间的值(你可以认为这是两个指针的差异)。指针差异(在ptrdiff_t 中使用)必须是有符号值。

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

编辑:这里使用带符号的值没有与范围相关的缺点,因为该值至少在[0, std::count] 范围内,而它本身将在[0, end_ptr - start_ptr] 范围内。因为end_ptr - start_ptr 被键入为ptrdiff_t 或类似的,所以它已签名。

【讨论】:

  • 废话。 std::count 描述清楚地表明:“返回范围 [first,last) 中比较等于 val 的 元素数。”元素数不能为负数。 count 参数(迭代器)的类型完全不相关。
  • @VioletGiraffe:是的。元素数不能为负数。但是countcount_if 的签名都包含迭代器。我并没有说定义许多签名的元素有多大意义......
猜你喜欢
  • 2014-08-20
  • 2020-08-11
  • 1970-01-01
  • 2013-03-27
  • 1970-01-01
  • 1970-01-01
  • 2013-04-12
  • 2023-03-02
  • 1970-01-01
相关资源
最近更新 更多