如果元素类型是基元,则向下调整std::vector::resize()是否需要O(1)个时间? P> >我理解,在C++中,代码> STD::vector::调整大小< /COD>当新的大小更小时,不分配新的内存。此外,如果元素类型是带有析构函数的用户定义类,则可以为在调整大小过程中“丢失”的每个元素调用该析构函数,因此在这种情况下,运行时间在大小差异中是线性的

如果元素类型是基元,则向下调整std::vector::resize()是否需要O(1)个时间? P> >我理解,在C++中,代码> STD::vector::调整大小< /COD>当新的大小更小时,不分配新的内存。此外,如果元素类型是带有析构函数的用户定义类,则可以为在调整大小过程中“丢失”的每个元素调用该析构函数,因此在这种情况下,运行时间在大小差异中是线性的,c++,memory-management,stdvector,C++,Memory Management,Stdvector,但是,如果元素类型是基元,例如std::vector,则没有可调用的析构函数。在这种情况下,调整大小向下调整是否有任何原因不会是O(1)次?标准中似乎无法保证这种复杂性。然而,正如您所指出的,在这种情况下,似乎也没有理由比常量更复杂。复杂性仅保证为O(n) 我会惊讶地发现一个编译器将其实现为基本类型的线性,但确保编译器设置的最佳方法是进行简单测试。这不是保证,但大多数流行的实现都会这样做。即使多余元素的销毁是O(n),没有什么能阻止这句话变得微不足道;O(f(N))意味着当N趋于无穷大时,在f(

但是,如果元素类型是基元,例如
std::vector
,则没有可调用的析构函数。在这种情况下,
调整大小
向下调整是否有任何原因不会是O(1)次?

标准中似乎无法保证这种复杂性。然而,正如您所指出的,在这种情况下,似乎也没有理由比常量更复杂。复杂性仅保证为
O(n)


我会惊讶地发现一个编译器将其实现为基本类型的线性,但确保编译器设置的最佳方法是进行简单测试。

这不是保证,但大多数流行的实现都会这样做。即使多余元素的销毁是
O(n)
,没有什么能阻止这句话变得微不足道;O(f(N))意味着当N趋于无穷大时,在f(N)之上有界,因此我们可以简单地说,对于任何f,包括指数、阶乘等,“没有什么能阻止O(f(N))为零”。