当我们使用矢量擦除或插入时会发生什么

时间:2017-02-05 13:00:04

标签: c++ vector

它是否从向量的右侧移动所有元素(如果删除则向左移动1个位置,如果插入则向右移动到1个位置)或者它是否像链接列表(它创建新地址并创建新地址)。 此外,当我用字符串初始化向量时,它如何处理内存。 如果它按顺序存储它,当它在达到最大内存分配时继续执行push_back时会发生什么。

1 个答案:

答案 0 :(得分:5)

保证std::vector(通过C ++标准)将元素存储在连续的内存区域中。这意味着不,它不像链表,而更像是动态分配的数组。当向量达到最大容量后,当push_back元素发生重新分配时,元素将被复制到新缓冲区中。当你使用插入或擦除元素时会发生同样的事情,因为这些操作通常是O(N)而不是O(1),就像链表一样。

因此看起来std::vectorstd::list更糟糕。但事实并非如此,因为在许多应用程序中,读取操作是主要的操作,由于缓存局部性而导致std::vectorstd::list更快,并且由于事实而导致O(1)随机访问元素是连续存储的。此外,push_back是O(1),除非向量执行重新分配(技术上push_pack具有分摊的O(1)复杂度)。