它被定义为向C++标准算法提供一个空范围吗

Is it defined to provide an empty range to C++ standard algorithms?

本文关键字:一个 范围 定义 C++ 算法 标准      更新时间:2023-10-16

继我之前的问题之后,我们能否证明标准允许我们将空范围传递给标准算法

第24.1/7段将"空范围"定义为范围[i,i)(其中i有效(,而i似乎可以从其自身"到达",但我不确定这是否符合证明。

特别是,我们在查看排序函数时遇到了麻烦。例如,std::sort:

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

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


(是的,好吧,我有点迂腐。当然,任何自尊的stdlib实现都不会在传递给std::sort的空范围内造成实际问题。但我想知道这里的标准措辞是否存在潜在漏洞。(

Big-O表示法是根据函数的极限来定义的。具有实际运行时间g(N)的算法是O(f(N))当且仅当lim N→∞ g(N)/f(N)是非负实数对于所有值N大于某个常数kg(N)/f(N)小于某个正实数C(Ck的确切值无关紧要;您只需要能够找到任何Ck就可以了(。(谢谢你的更正,Jesse!(

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

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

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

24.1/7美元:

范围[i,j(是有效的,当且仅当j可从i.到达

由于0是有限的,因此[i, i)是一个有效范围。§24.1/7接着说:

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

这并不能说一个有效的范围保证了定义的结果(合理的,因为还有其他要求,比如比较函数(,但似乎肯定意味着一个空的范围本身不应该导致UB或类似的情况。然而,特别是,该标准使空范围成为另一个有效范围;空的和非空的有效范围之间没有真正的区别,所以适用于非空有效范围的内容同样适用于空有效范围。

除了@bdonlan给出的相关答案外,还要注意,当n变为零时,f(n) = n * log(n)确实有一个定义明确的极限,即0。这是因为对数的发散速度比任何多项式都慢,特别是比n慢。所以一切都很好:-(