没看懂Effective STL关于vector的说明

时间:2022-02-22 15:45:33
书上说: 因为vector<bool>是一个伪容器,并不保存真正的bool,而是打包bool以节省空间。 vector<bool>是一个伪容器,并不保存真正的bool,而是打包bool以节省空间。在一个典型的实现中,每个保存在“vector”中的“bool”占用一个单独的比特,而一个8比特的字节将容纳8个“bool”。在内部,vector<bool>使用了与位域(bitfield)等价的思想来表示它假装容纳的bool。

我写了几行代码来测试一下,发现有问题。既然vector<bool>就是存储的位域,那么至少我可以获得一个字节的内容吧。但是下面的代码在VC10下面崩溃了。为什么呢?


#include<iostream>
#include<vector>
using namespace std;
int main(void){
    vector<bool> vb;
    vb[0]=1;
    vb[1]=2;
    cout<<*(bool*)(&vb)<<endl;
    return 0;
}

11 个解决方案

#1


vb[0]=1;
    vb[1]=2;

换成
vb.push_back(1);

你那样越界

#2


vb[0]=1;
    vb[1]=2;
换成
vb.push_back

你那样越界

#3


楼主你现在的vb里面空空如也的,直接用[]操作肯定越界了,像楼上说的,用push_back插入进去吧

#4


没有直接用【】会插入吧

#5


引用 4 楼  的回复:
没有直接用【】会插入吧

map是这样的,但是vector不是

#6


该回复于2012-04-18 12:54:30被版主删除

#7


改成这样:

#include<iostream>
#include<vector>
using namespace std;
int main(void){
    vector<bool> vb(1024);// SIZE
    vb[0]=1;
    vb[1]=2;// bool(2)==1.
    cout<<*(bool*)(&vb[0])<<endl;
    return 0;
}

#8


引用 7 楼  的回复:
改成这样:
C/C++ code

#include<iostream>
#include<vector>
using namespace std;
int main(void){
    vector<bool> vb(1024);// SIZE
    vb[0]=1;
    vb[1]=2;// bool(2)==1.
    cout<<*(bool*)(&amp;vb[0])<<……


改成了你这样以后,打印的结果是128.
这个128是怎么来的呢?
我debug看vb的内容是true,true,false,false.....false,前两个字节是1.
那么转成bool类型(char)就是0b11000000应该是192才对啊,为什么是128?

还有就是,vb的构造函数如果没有指定大小就会程序崩溃? 指定了大小就可以运行的?

谢谢!

#9


楼上那代码结果是1吧,你的是128?
vb(1024) 这样是预先申请了空间,vector是一个能够存放任意类型的动态数组,能够增加和压缩数据 
引用 8 楼  的回复:
引用 7 楼 的回复:

改成这样:
C/C++ code

#include<iostream>
#include<vector>
using namespace std;
int main(void){
vector<bool> vb(1024);// SIZE
vb[0]=1;
vb[1]=2;// bool(2)==1.
cout<<*(bool*)(&amp;am……

#10


引用 9 楼  的回复:
楼上那代码结果是1吧,你的是128?
vb(1024) 这样是预先申请了空间,vector是一个能够存放任意类型的动态数组,能够增加和压缩数据 引用 8 楼  的回复:
引用 7 楼 的回复:

改成这样:
C/C++ code

#include<iostream>
#include<vector>
using namespace std;
int main(void){
……


我在vc2010下面又测试了一下,这次不是128,也不是1,
而是直接崩溃了。

为什么呢?

#11


引用 10 楼  的回复:
引用 9 楼  的回复:

楼上那代码结果是1吧,你的是128?
vb(1024) 这样是预先申请了空间,vector是一个能够存放任意类型的动态数组,能够增加和压缩数据 引用 8 楼  的回复:
引用 7 楼 的回复:

改成这样:
C/C++ code

#include<iostream>
#include<vector>
using namespace std;
……


7楼的代码是错的.

vb[0] 其实是一个引用代理类对象,不是一个bool 类型的对象....不解释,自己看书.以后你就懂了...
你直接cout<<vb[0]; 就可以了.

#1


vb[0]=1;
    vb[1]=2;

换成
vb.push_back(1);

你那样越界

#2


vb[0]=1;
    vb[1]=2;
换成
vb.push_back

你那样越界

#3


楼主你现在的vb里面空空如也的,直接用[]操作肯定越界了,像楼上说的,用push_back插入进去吧

#4


没有直接用【】会插入吧

#5


引用 4 楼  的回复:
没有直接用【】会插入吧

map是这样的,但是vector不是

#6


该回复于2012-04-18 12:54:30被版主删除

#7


改成这样:

#include<iostream>
#include<vector>
using namespace std;
int main(void){
    vector<bool> vb(1024);// SIZE
    vb[0]=1;
    vb[1]=2;// bool(2)==1.
    cout<<*(bool*)(&vb[0])<<endl;
    return 0;
}

#8


引用 7 楼  的回复:
改成这样:
C/C++ code

#include<iostream>
#include<vector>
using namespace std;
int main(void){
    vector<bool> vb(1024);// SIZE
    vb[0]=1;
    vb[1]=2;// bool(2)==1.
    cout<<*(bool*)(&amp;vb[0])<<……


改成了你这样以后,打印的结果是128.
这个128是怎么来的呢?
我debug看vb的内容是true,true,false,false.....false,前两个字节是1.
那么转成bool类型(char)就是0b11000000应该是192才对啊,为什么是128?

还有就是,vb的构造函数如果没有指定大小就会程序崩溃? 指定了大小就可以运行的?

谢谢!

#9


楼上那代码结果是1吧,你的是128?
vb(1024) 这样是预先申请了空间,vector是一个能够存放任意类型的动态数组,能够增加和压缩数据 
引用 8 楼  的回复:
引用 7 楼 的回复:

改成这样:
C/C++ code

#include<iostream>
#include<vector>
using namespace std;
int main(void){
vector<bool> vb(1024);// SIZE
vb[0]=1;
vb[1]=2;// bool(2)==1.
cout<<*(bool*)(&amp;am……

#10


引用 9 楼  的回复:
楼上那代码结果是1吧,你的是128?
vb(1024) 这样是预先申请了空间,vector是一个能够存放任意类型的动态数组,能够增加和压缩数据 引用 8 楼  的回复:
引用 7 楼 的回复:

改成这样:
C/C++ code

#include<iostream>
#include<vector>
using namespace std;
int main(void){
……


我在vc2010下面又测试了一下,这次不是128,也不是1,
而是直接崩溃了。

为什么呢?

#11


引用 10 楼  的回复:
引用 9 楼  的回复:

楼上那代码结果是1吧,你的是128?
vb(1024) 这样是预先申请了空间,vector是一个能够存放任意类型的动态数组,能够增加和压缩数据 引用 8 楼  的回复:
引用 7 楼 的回复:

改成这样:
C/C++ code

#include<iostream>
#include<vector>
using namespace std;
……


7楼的代码是错的.

vb[0] 其实是一个引用代理类对象,不是一个bool 类型的对象....不解释,自己看书.以后你就懂了...
你直接cout<<vb[0]; 就可以了.