我听说std::vector在内部实现中有一个C风格的数组,但这不是动态容器的整个目的吗?
那么,在向vector插入值时,它是O(n)操作吗?还是像链表一样是O(1)?
我听说std::vector在内部实现中有一个C风格的数组,但这不是动态容器的整个目的吗?
那么,在向vector插入值时,它是O(n)操作吗?还是像链表一样是O(1)?
std::vector
中的内存必须是连续的,因此通常表示为数组。
你关于std::vector
操作复杂度的问题很好 - 我记得自己刚开始编程时也曾经想过这个问题。如果将元素附加到std::vector
中,则可能需要执行调整大小操作并将所有现有元素复制到新数组中。在最坏情况下,这将花费O(n)时间。然而,附加元素的摊销成本为O(1)。我们的意思是,任何n次附加到std::vector
的序列的总成本始终为O(n)。其背后的直觉是,std::vector
通常会在其数组中过度分配空间,留下许多免费插槽供元素插入而无需重新分配。因此,大多数附加操作将花费O(1)的时间,即使偶尔有一个需要花费O(n)的时间。
话虽如此,在 std::vector
中进行插入操作的成本将是 O(n),因为您可能需要将所有东西向下移动。
您还问了为什么这样做,如果它破坏了动态数组的目的。即使 std::vector
只像托管数组一样工作,它仍然优于原始数组。 std::vector
知道其大小,可以使用 at
进行边界检查,是一个实际的对象(不像数组),并且不会退化为指针。这些额外的功能 - 加上使附加操作快速工作的额外逻辑 - 几乎总是值得的。
std::list
。因此,std::vector
不是链表--它基本上是一个动态数组,并且具有与您所期望的相同的插入时间(O(n)
),除非插入到序列的末尾。https://dev59.com/NHVC5IYBdhLWcg3wykej - PaulMcKenzie