vector<bool>的特殊性 | Nobilta's Blog
0%

vector的特殊性

在stl的时候突然发现了一句很有意思的话:“vector不是储存bool类型元素的vector容器。”出于好奇,仔细了解了一下。

首先,vector是一个容器,但是vector不是STL容器
按理来说bool类型应该是大小1byte=8bit的一个变量,但是在vector中,储存的每一个元素为1bit而不是1byte(这好像是c++98的一个历史遗留问题?)
假设有如下代码:

1
2
3
4
vector<bool> a = {true,false,true}
bool b = a[0];
auto c = a[0];
c = false;

如果我们检查c的类型,会发现c并不是bool类型的,而此时再输出a[0],发现a[0] = false。这其中包含了一个隐式的转换,c实则为vector中的一个内部类的类型。而此时如果我们delete a,那么c将变成一个悬垂指针(野指针)而一下代码在编译过程中也会报错:

1
2
&p = c[0];
bool *pp = &c[0];

因为c[0]根本不能作为一个左值,且c[0]返回的是临时量,无法给指针赋值。
stl真是太神奇了

您的支持将鼓励我继续创作!