std::deque 是否是连续的内存容器?

myo*_*dpa 5 c++ stl deque

std::deque 是否是连续的内存容器?

Scott Meyers 的著名著作《Effective STL》如下所述

连续内存容器(也称为基于数组的容器)将其元素存储在一个或多个(动态分配的)内存块中,每个块保存多个容器元素。如果插入新元素或删除现有元素,同一内存块中的其他元素必须向上或向下移动,以便为新元素腾出空间或填充以前被擦除元素占用的空间。这种移动会影响性能(参见第 5 条和第 14 条)和异常安全(我们很快就会看到)。标准的连续内存容器是向量、字符串和双端队列。非标准绳索也是连续内存容器。

但你可以在 cppreference.com 找到相反的解释

与 std::vector 不同,双端队列的元素不是连续存储的:典型的实现使用一系列单独分配的固定大小数组,并进行额外的簿记,这意味着与向量相比,对双端队列的索引访问必须执行两次指针取消引用索引访问仅执行一项。

哪一个是真的?

for*_*818 7

两个引用之间没有冲突。Scott 使用术语“连续容器”的含义比您在其他地方看到的更广泛。

斯科特写道(强调我的):

连续内存容器(也称为基于数组的容器)将其元素存储在一个或多个(动态分配的)内存块中,[...]

正如 cppref 的引用所述,std::deque使用多个数组来存储元素。每个数组内的元素是连续的。Scott 并没有声称 a 中的所有元素std::deque在一块内存中都是连续的。

  • @myoldgrandpa • 考虑一个“向量<string>”。每个“string”将“char”存储在连续的内存块中。但对于“向量”来说,块并不连续。`deque` 就是这样;它具有分散的不连续的块,并且在块内对象是连续的。 (2认同)