它是否从向量的右侧移动所有元素(如果删除则向左移动1个位置,如果插入则向右移动到1个位置)或者它是否像链接列表(它创建新地址并创建新地址)。 此外,当我用字符串初始化向量时,它如何处理内存。 如果它按顺序存储它,当它在达到最大内存分配时继续执行push_back时会发生什么。
答案 0 :(得分:5)
保证std::vector
(通过C ++标准)将元素存储在连续的内存区域中。这意味着不,它不像链表,而更像是动态分配的数组。当向量达到最大容量后,当push_back元素发生重新分配时,元素将被复制到新缓冲区中。当你使用插入或擦除元素时会发生同样的事情,因为这些操作通常是O(N)而不是O(1),就像链表一样。
因此看起来std::vector
比std::list
更糟糕。但事实并非如此,因为在许多应用程序中,读取操作是主要的操作,由于缓存局部性而导致std::vector
比std::list
更快,并且由于事实而导致O(1)随机访问元素是连续存储的。此外,push_back是O(1),除非向量执行重新分配(技术上push_pack具有分摊的O(1)复杂度)。