【发布时间】:2014-05-16 19:51:21
【问题描述】:
标题说明了一切。文档页面中甚至还有一个warning:
当 C++ 中的常见做法是使用开放范围 [begin, end) 时,为什么要这样做?
【问题讨论】:
标题说明了一切。文档页面中甚至还有一个warning:
当 C++ 中的常见做法是使用开放范围 [begin, end) 时,为什么要这样做?
【问题讨论】:
只有在封闭范围内,您才能创建一个uniform_int_distribution,它会产生任何整数:
uniform_int_distribution<int> dist(std::numeric_limits<int>::min(), std::numeric_limits<int>::max());
如果这是一个半开范围,您将永远无法到达std::numeric_limits<int>::max(),而只能到达std::numeric_limits<int>::max() - 1。
对于 C++11 标准库中的std::uniform_int_distribution 也是同样的情况。
迭代器的半开范围很常见,因为可以很容易地表示空范围(通过设置begin == end)。这对分发没有意义。
参考:Stephan T. Lavavej 在 Going Native 2013 的演讲 "rand() Considered Harmful"(大约第 14 分钟)中提到了这个确切的原因。本次演讲是关于 C++11 <random>,当然同样的推理也适用于 boost。
【讨论】: