【问题标题】:Why does std::count return a signed integer? [duplicate]为什么 std::count 返回一个有符号整数? [复制]
【发布时间】:2013-02-11 12:12:53
【问题描述】:

看到std::count 在我的平台上返回了iterator_traits<InputIterator>::difference_type,这又是指long int,我感到非常惊讶。

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

【问题讨论】:

  • 如果范围无效,差异只会是负数,这会在算法期间产生未定义的行为。
  • 这个讨论可能会有所帮助:stackoverflow.com/questions/7505083/…
  • @ChristianIvicevic,我很困惑。它是未定义的行为吗?我的意思是,要么检查迭代器边界并在错误时返回负值,要么它是未定义的行为,然后它返回的是未定义的。
  • 请参考 Joachim 的回答 - std::count 只返回两个迭代器之间的距离,当然,一旦你选择了一个无效的范围,它可能是负数。在这种情况下,当您从 n+1 计数到 n 时,就会出现未定义的行为。这将如何运作?这取决于所使用的类型和迭代器。
  • “容器中的负计数元素没有任何意义。” - 您似乎即将建议在不可能出现负值的情况下“应该”使用无符号类型。有很多经验丰富的 C++(和 C)程序员强烈反对这个建议。您似乎也将讨论限制在容器上。迭代器不仅用于迭代容器,它们还可以迭代其他事物,尽管无论它们迭代什么,负数确实没有意义。

标签: c++ types containers c++-standard-library


【解决方案1】:

它实际上是一个std::ptrdiff_t,它必须是一个有符号整数。它必须被签名,因为它可以用作两个迭代器之间的差异,当然也可以是负数。

【讨论】:

  • +1。该死的,我应该创建一个答案而不是评论......但是是的,这是正确的。
  • 那么下一个问题是,为什么他们使用std::ptrdiff_t 表示std::count,并且在另一篇文章中得到了回答。所以,谢谢。
  • @qdii std::iterator_traits<T>::difference_type 与默认为ptrdiff_t 的迭代器difference_type 相同(例如here。为什么将距离指定为ptrdiff_t 可能是 因为迭代器可以像指针一样使用,但是 (C++11) 规范实际上并没有给出原因,它只是指定它必须是那种类型。
  • @JoachimPileborg:我认为difference_type 默认为ptrdiff_t 的原因是指针减法导致ptrdiff_t。所以iterator_traits<T*>::difference_type 必须是ptrdiff_t,并且迭代器的默认值是指针的默认值是有意义的。不过,我可能错过了一些你想要更强有力的解释的理由。
猜你喜欢
  • 2011-04-09
  • 2015-05-11
  • 1970-01-01
  • 1970-01-01
  • 2013-04-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多