了解标准::矢量规范

Understanding std::vector specification

本文关键字:标准 了解      更新时间:2023-10-16

c++14 标准 n4140 [vector.overview]/1 的草案如下:

向量是支持随机访问迭代器的序列容器。此外,它还支持(摊销(最后的恒定时间插入和擦除操作;中间的插入和擦除需要线性时间。存储管理是自动处理的,但可以给出提示以提高效率。向量的元素是连续存储的,这意味着如果v是一个vector<T, Allocator>,其中Tbool以外的某种类型,那么它服从所有0 <= n < v.size()的恒等&v[n] == &v[0] + n

为什么除布尔值之外的所有类型的恒等&v[n] == &v[0] + n0 <= n < v.size()都是正确的?据我所知,C++是字节解决的。因此,这应该仅适用于大小为一个字节的类型。

&v[0]是指向由向量括起来的类型(vector<bool>除外(的指针。&v[0]+ n 更改指针以指向第 n 个元素,而不管该元素的大小(以字节为单位(。

正如巴里所指出的,vector<bool>' is a specialization to reduce the space consumed and pack bits. It's unlike all other载体的容器。在执行以下操作时,这会产生问题:

vector<bool> b{true, false};
auto& val=b[0];

Val 不是对布尔值的引用!

因为vector<bool>不仅仅是一个拥有bools的vector。这是一种完全不同的野兽。它有部分专用化 - 它表现为动态位集,在一个字节中存储 8bool秒。所以这个身份不成立。事实上,你甚至无法从vector<bool>中得到一个bool&,你只能得到代理引用。

因此,这应该仅适用于大小为一个字节的类型。

这里的尺寸无关紧要。&v[n] == &v[0] + n适用于所有类型,bool除外。对于bool,这是格式不正确的,因为&v[0]根本不是一个有效的表达式(更不用说指针了(。


换个说法。对于除bool之外的所有Tvector<T>的行为很像具有动态已知长度的T[]v[i]是一个特定的T&v[i]是一个指向特定T的指针。你所知道和喜欢的关于数组的一切都适用于vector。就像那个指针身份一样。

vector<bool>不是bool[].v[i]不是一个特定的bool,它是一个可转换为bool的对象。&v[i]不是指向特定bool的指针,它甚至不是一个有效的表达式,因为它不是左值v[i]

您尝试使用vector<T>用于未知T的事情与其他所有T一起使用bool失败,例如:

std::vector<T> v = ...;
for (auto& elem : v) { ... } // ok for every T. except bool.