Can操作的时间复杂度由C&x2B+;标准动态分配内存? C++标准不要求内存分配的时间复杂性,因为它超出了它的域(通常取决于OS的行为),但是这是否意味着任何指定的复杂度都不能动态分配内存?

Can操作的时间复杂度由C&x2B+;标准动态分配内存? C++标准不要求内存分配的时间复杂性,因为它超出了它的域(通常取决于OS的行为),但是这是否意味着任何指定的复杂度都不能动态分配内存?,c++,standards,language-lawyer,C++,Standards,Language Lawyer,例如,标准库中的大多数容器都需要有一个恒定时间复杂度的默认构造函数,因此任何预先动态分配内存的实现都会违反标准。(该特定行为是否可取并不重要——这只是一个听起来有点合理的示例。)对吗?该标准明确规定了其要求的“时间复杂性”中包含的内容: 23.2.1[集装箱.要求.概述]/2 本条款中的所有复杂度要求仅以所包含对象上的操作数量来说明。[示例:类型为vector的复制构造函数具有线性复杂性,即使复制包含的每个vector的复杂性本身是线性的。-结束示例] 对于该条款之外的功能,复杂性要求被明确规定

例如,标准库中的大多数容器都需要有一个恒定时间复杂度的默认构造函数,因此任何预先动态分配内存的实现都会违反标准。(该特定行为是否可取并不重要——这只是一个听起来有点合理的示例。)对吗?

该标准明确规定了其要求的“时间复杂性”中包含的内容:

23.2.1[集装箱.要求.概述]/2

本条款中的所有复杂度要求仅以所包含对象上的操作数量来说明。[示例:类型为
vector
的复制构造函数具有线性复杂性,即使复制包含的每个
vector
的复杂性本身是线性的。-结束示例]

对于该条款之外的功能,复杂性要求被明确规定,例如

25.4.3.1[下限]/3
(即
std::下限

复杂性:最多
log2(last-first)+O(1)
比较

(注意,只计算比较:下限可以,对于正向迭代器,将执行线性扫描)


因此,是的,复杂度由标准强制规定的算法可以动态分配内存,或者做任何他们想做的事情,只要它们满足实际的约束。

那么,它是O(N log²(N))还是O(N log(N))呢取决于额外内存是否可用?@chris,这一点很奇怪,似乎暗示了对动态内存分配的时间复杂性的限制,但“如果有足够的额外内存可用”可以解释为“如果静态分配的内存块足够”。它必须忽略内存分配的时间复杂性,因为每个容器都是在一个分配器类型上模板化的,理论上可能有任何可能的时间复杂性。我也不同意你的结论;例如,向量上的push_back指定了摊销的恒定时间复杂度,但是,这可能会动态分配(更多)内存。@chris-对于HP/Microsoft版本的std::stable_sort,它为要排序的数据大小的1/2分配临时空间,对两部分进行排序,根据需要进行复制,使前半部分位于临时空间,后半部分位于数据的后半部分,然后将临时数据与后半部分合并回原始数据。似乎还有一些处理进一步递归和拆分的遗留代码,但在我看来,这些代码似乎不再被使用了。我认为第一句话不太相关,但指出了如何正确“解析”复杂性要求。@praxelitic第一句话中的示例是相关的;即使一个算法的每一步都做了一些任意的繁重工作,它也被算作“1”。。但是,是的,下界最好地证明了具有特定复杂性意味着什么。