是否定义为C ++标准算法提供空范围?

时间:2011-09-21 19:08:09

标签: c++ c++11 language-lawyer std

my previous question开始,可以证明标准允许我们将空范围传递给标准算法吗?

第24.1 / 7段将“空范围”定义为范围[i,i)(其中i有效),而i似乎是“可到达的”,但我我不确定这是否有资格证明。

特别是,在查看排序功能时会遇到麻烦。例如,std::sort

  

复杂性:O(N log(N))(其中N == last - first)比较

由于log(0)通常被认为是未定义的,而且我不知道0*undefined是什么,这里会出现问题吗?


(是的,好吧,我有点迂腐。当然,没有自尊的 stdlib 实现会导致实际问题,传递给std::sort的空范围但我想知道这里的标准措辞是否存在漏洞。)

3 个答案:

答案 0 :(得分:10)

Big-O表示法是根据函数的限制来定义的。当且仅当 g(N)为非负实数 {{1}时,实际运行时间O(f(N))的算法为lim N→∞ g(N)/f(N)所有值g(N)/f(N)大于某个常量C的{​​{1}}小于某些正实数NkC的确切值并不重要;您必须能够找到任何 kC才能使其生效。 (谢谢你的纠正,杰西!)

您会注意到实际元素数量与big-O分析无关。 Big-O分析没有说明算法对少量元素的行为;因此,在k定义f(N)并不重要。更重要的是,实际运行时行为由不同的函数N=0控制,即使g(N)也可以在N=0定义是未定义的。

答案 1 :(得分:6)

我似乎没有很多的问题空间。在§24.1/ 6中,我们被告知:

  

迭代器j被称为可以从迭代器i到达,当且仅当表达式++ i的应用程序的有限序列使得i == j时才会出现。

和$ 24.1 / 7:

  

当且仅当j可从i到达时,范围[i,j]才有效。

由于0是有限的,[i, i)是有效范围。 §24.1/ 7继续说:

  

将库中的函数应用于无效范围的结果是   未定义。

这并不是说有效范围保证定义的结果(合理的,因为还有其他要求,比如比较函数),但当然似乎暗示范围是空的,本身,不应该导致UB或类似的东西。然而,特别是,该标准使空范围只是另一个有效范围;空的和非空的有效范围之间没有真正的区别,因此适用于非空有效范围的情况同样适用于空的有效范围。

答案 2 :(得分:3)

除了@bdonlan给出的相关答案之外,还要注意f(n) = n * log(n)确实有明确定义的限制,因为n变为零,即0。这是因为对数的偏差比任何多项式都慢,特别是慢于n。一切都很好: - )