【发布时间】: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