c ++ 14标准n4140 [vector.overview]/1的草案规定如下:
向量是支持随机访问迭代器的序列容器。另外,它在末尾支持(摊销)恒定时间插入和擦除操作。在中间插入和擦除需要线性时间。存储管理是自动处理的,尽管可以提供一些提示以提高效率。向量的元素是连续存储的,这意味着如果
v
是vector<T, Allocator>
,其中T
是bool
以外的某种类型,则它遵循身份{{1} }&v[n] == &v[0] + n
。
为什么0 <= n < v.size()
的身份&v[n] == &v[0] + n
对于除布尔型之外的所有类型都是正确的?据我所知,C ++是字节地址。因此,这仅对大小为一个字节的类型成立。
答案 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]
以外的所有T
,bool
的行为都非常像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