💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、星火、月之暗面及文生图 广告
[TOC] ### what ***** 做为一个STL容器,vector确实只有两个问题。第一,它不是一个STL容器。第二,它并不容纳bool。 除此以外,就没有什么要反对的了。 ### how ***** 如果c是一个T类型对象的容器,且c支持operator\[\], 那么以下代码必须能够编译: ``` T *p = &c[0]; // 无论operator[]返回什么, 都可以用这个地址初始化一个T* ``` ### why ***** 如果你使用operator[]来得到Container中的一个T对象,你可以通过取它的地址而获得指向那 个对象的指针。(假设T没有倔强地重载一些操作符。)然而如果vector是一个容器,这段代码必须能 够编译: ``` vector v; bool *pb = &v[0]; // 用vector::operator[]返回的东西的地址初始化一个bool* ``` 它不能编译。因为vector是一个伪容器,并不保存真正的bool,而是打包bool以节省空间。在一个典 型的实现中,每个保存在“vector”中的“bool”占用一个单独的比特,而一个8比特的字节将容纳8 个“bool”。在内部,vector使用了与位域(bitfield)等价的思想来表示它假装容纳的bool。 ### 替代品 ***** 第一个是deque。deque提供了几乎所有vector所 提供的(唯一值得注意的是reserve和capacity),而deque是一个STL容器,它保存真正的bool值。当 然,deque内部内存不是连续的。所以不能传递deque中的数据给一个希望得到bool数组的C API。 第二个vector的替代品是bitset。bitset不是一个STL容器,但它是C++标准库的一部分。与STL容器不 同,它的大小(元素数量)在编译期固定,因此它不支持插入和删除元素。此外,因为它不是一个STL容 器,它也不支持iterator。但就像vector,它使用一个压缩的表示法,使得它包含的每个值只占用1bit,它提供vector特有的flip成员函数,还有一系列其他操作位集(collection of bits)所特有的成员函 数。如果不在乎没有迭代器和动态改变大小,你也许会发现bitset正合你意。