它被定义为向C++标准算法提供一个空范围吗
Is it defined to provide an empty range to C++ standard algorithms?
继我之前的问题之后,我们能否证明标准允许我们将空范围传递给标准算法
第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
大于某个常数k
,g(N)/f(N)
小于某个正实数C
(C
和k
的确切值无关紧要;您只需要能够找到任何C
和k
就可以了(。(谢谢你的更正,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
慢。所以一切都很好:-(
- 使用std::transform将一个范围的元素添加到另一个范围中
- 如何设置一个范围来提取我想要获得的信息
- 不计算一个范围内的完美数
- 我有一个数组,我想输入一个范围,然后找到范围内所有偶数的总和?
- 在 C++20 中将多个范围适配器连接到一个范围中
- 如何将一个范围替换为矢量中的另一个范围?
- 将整数范围映射到另一个范围
- 是否存在一个范围::视图::group_by对应项,它将所有元素都考虑在内,而不是只考虑连续的元素
- 我已经编写了C++代码将 boost::optional 视为一个范围,但它无法编译
- 当在另一个范围中,将SelfAdjointeigensolver保存为成员的结果被重新引入
- C :在一个范围内计数偶数 /奇数
- 删除重复的元素并给出一个范围总和
- 为什么即将到来的范围库不支持一个范围的容器初始化
- 将无符号整数加法/减法括在一个范围周围
- 更快的方法将数字从范围转换为另一个范围
- 在一个范围内的阵列中找到三胞胎
- 如何在C++中选择多维数组中的一个范围
- 如何检查一个范围内的值是否是另一个范围内的值的倍数
- 将 std::vector<int> 设置为一个范围
- 正在检查排序列表中是否有一个范围内的数字