c++中为啥不提倡使用vector\u003cbool\u003e
vector\u0026lt;bool\u0026gt;并不是一个STL容器,不是一个STL容器,不是一个STL容器!
首先vector\u0026lt; bool\u0026gt; 并不是一个通常意义上的vector容器,这个源自于历史遗留问题。 早在C++98的时候,就有vector\u0026lt; bool\u0026gt;这个类型了,但是因为当时为了考虑到节省空间的想法,所以vector\u0026lt; bool\u0026gt;里面不是一个Byte一个Byte储存的,它是一个bit一个bit储存的!
因为C++没有直接去给一个bit来操作,所以用operator的时候,正常容器返回的应该是一个对应元素的引用,但是对于vector\u0026lt; bool\u0026gt;实际上访问的是一个"proxy reference"而不是一个"true reference",返回的是"std::vector\u0026lt; bool\u0026gt;:reference"类型的对象。 而一般情况情况下vector\u0026lt;bool\u0026gt; c{ false, true, false, true, false }; bool b = c; auto d = c; 对于b的初始化它其实暗含了一个隐式的类型转换。
而对于d,它的类型并不是bool,而是一个vector\u0026lt; bool\u0026gt;中的一个内部类。
而此时如果修改d的值,c中的值也会跟着修改d = true;for(auto i:c) cout\u0026lt;\u0026lt;i\u0026lt;\u0026lt;" ";cout\u0026lt;\u0026lt;endl;//上式会输出1 1 0 1 0而如果c被销毁,d就会变成一个悬垂指针,再对d操作就属于未定义行为。
而为什么说vector\u0026lt; bool\u0026gt;不是一个标准容器,就是因为它不能支持一些容器该有的基本操作,诸如取地址给指针初始化操作vector\u0026lt;bool\u0026gt; c{ false, true, false, true, false }; \u0026amp;tmp = c;\t//错误,不能编译,对于引用来说,因为c不是一个左值 bool *p = \u0026amp;c;\t//错误,不能编译,因为无法将一个临时量地址给绑定到指针 ``` 我之前写过一篇Blog也是讲这个的:
谈vector \u0026amp;amp;lt; bool \u0026amp;amp;gt; 的特殊性--为什么它不是STL容器 - haolexiao的专栏 - 博客频道 - CSDN.NET
■网友
避免使用vector\u0026lt;bool\u0026gt;简单的说就是它并未实际保存一个bool, 而是用位域的概念进行了封装.所以你在实际应用的时候可能会发生一些你意料之外的问题.
■网友
作为一个 STL 容器,vector\u0026lt;bool\u0026gt; 确实只有两个问题:
1. 它不是一个STL容器
2. 它并不容纳 bool
因为vector\u0026lt;bool\u0026gt; 打包 bool 以节省空间,每个保存在“vector”中的“bool”占用一个单独的bit,而禁止有指向单个比特的指针,所以vector\u0026lt;bool\u0026gt;不能编译下式:vector\u0026lt;bool\u0026gt; v; 2 bool *pb = \u0026amp;v; // 使用 vector\u0026lt;bool\u0026gt;::operator 返回的东西的地址初始化一个bool*
标准库提供了两个替代品,它们满足几乎所有的需求:
1. 第一个是deque\u0026lt;bool\u0026gt;
deque提供了几乎多有vector所提供的,而且deque\u0026lt;bool\u0026gt; 保存真正的bool值
【c++中为啥不提倡使用vector\u003cbool\u003e】 2. bitset。
bitset 不是STL容器,是C++标准库的一部分,大小在编译期固定,因此不支持插入和删除元素,不是迭代器,不支持iterator。压缩表示,每个值只占用一比特。提供vector\u0026lt;bool\u0026gt; 特有的 flip 成员函数,还有一些列其他操作位集所特有的成员函数。如果不在意没有迭代器和动态改变大小,bitset正合适。
更多详细内容,可以参考effective STL第18条(强烈安利这本书)
推荐阅读
- 为啥看到书柜上的藏书会有心旷神怡的感觉
- 为啥知乎上普便有一种【我在北上广深打工,所以拥有更好的视野】这样的错觉
- 为啥工商银行的用户体验如此之差
- 汽车|看了中消协4S店服务测评调查结果,终于知道法系车为啥卖不好了
- 你为啥从窝窝商城离职?
- 为啥5G和2.4G默认的BSSID是相同的
- 为啥电器实体店的价格比淘宝贵那么多
- 现在在线学习视频有很多了,为啥大部分人还是喜欢下载下来观看
- 为啥到现在你还没有女朋友 ?
- 天赐的声音|33岁张雨绮为啥总离婚?看过这些照片就明白了,都是性感惹得祸
