了解std :: vector规范

时间:2018-09-23 21:18:08

标签: c++ language-lawyer

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

  

向量是支持随机访问迭代器的序列容器。另外,它在末尾支持(摊销)恒定时间插入和擦除操作。在中间插入和擦除需要线性时间。存储管理是自动处理的,尽管可以提供一些提示以提高效率。向量的元素是连续存储的,这意味着如果vvector<T, Allocator>,其中Tbool以外的某种类型,则它遵循身份{{1} } &v[n] == &v[0] + n

为什么0 <= n < v.size()的身份&v[n] == &v[0] + n对于除布尔型之外的所有类型都是正确的?据我所知,C ++是字节地址。因此,这仅对大小为一个字节的类型成立。

2 个答案:

答案 0 :(得分:4)

&v[0]是指向向量包围的类型的指针(vector<bool>除外)。 &v[0] + n会将指针更改为指向第n个元素,无论该元素的字节数如何。

正如Barry所指出的,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不是布尔值!

答案 1 :(得分:3)

因为vector<bool>不仅仅是保存vector的{​​{1}}。这是一种完全不同的野兽。有一个partial specialization-它的行为就像一个动态位集,在一个字节中存储8个bool。这样身份就不成立了。确实,您甚至无法从bool中获得bool&,而仅获得代理引用。

  

因此,这仅对大小为一个字节的类型 成立。

这里的大小无关紧要。 vector<bool>适用于所有类型,除了 &v[n] == &v[0] + n。对于bool,这是格式错误的,因为bool根本不是有效的表达式(更不用说指针了)。


用不同的方式表达这一点。对于&v[0]以外的所有Tbool的行为都非常像vector<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