我在很多地方看到过,比如这里,说std::vector
总是连续的,但我没有找到解释其意义或为什么这很重要的说明?
这是否意味着它们在内存中有一个固定的位置或者其他什么呢?
std::vector
中的元素占据一段连续的内存块。 std::vector
是一个改进的数组。std::vector
要求查找速度快,但不保证是连续的。这在 C++11 标准中已经修复。另外,std::vector<bool>
不是连续的。 - Eldar Dordzhievstd::forward_list
在内存中的结构如下:
在这里,橙色地址包含容器的元素。但是它们分散在内存中。还有灰色元素;它们代表列表需要的额外内存,以使每个元素知道下一个元素的位置。[*]
可以想象,std::vector的清晰简洁的内存表示给您带来了许多优势。这就解释了为什么std::vector具有其他容器缺乏的某些操作,或者为什么这些操作在常数时间内运行。例如,要到达第n个元素,只需执行一次加法(基地址+n)。这也解释了为什么您可以安全地获取&v [0]并对其执行指针算术运算。
由于没有任何答案提到这一点:
感谢 std::vector
的这个特性,你可以做出以下操作:
std::ifstream file( "file.txt", std::ios::ate | std::ios::binary );
std::vector<char> vec;
if (!file)
{
file.seekg(0, std::ios_base::end);
auto fileSize = file.tellg();
vec.resize(fileSize);
file.seekg(0, std::ios_base::beg);
// here we leverage contiguous memory in std::vector
file.read(&vec[0], fileSize);
}
避免逐个读取/写入元素的方法。
这可以自C++03开始使用,正如(C++03)标准中所述(23.2.4.1)
vector
的元素是连续存储的,这意味着如果v
是一个vector
,其中T
是除bool
之外的某种类型,则它遵循所有0 <= n < v.size()
的恒等式&v[n] == &v[0] + n
。