我需要存储位的动态数组。
上矢量<布尔>的C ++参考页面有以下信息:
存储不一定是数组
bool
值,但是,使每个值存储在一个单个位库实现可以优化存储。
我如何确保我的程序使用vector<bool>
做其实店里位向量,而不是布尔值(字节)?
我需要存储位的动态数组。
上矢量<布尔>的C ++参考页面有以下信息:
存储不一定是数组
bool
值,但是,使每个值存储在一个单个位库实现可以优化存储。
我如何确保我的程序使用vector<bool>
做其实店里位向量,而不是布尔值(字节)?
不要尝试这样做。 相反,使用boost::dynamic_bitset
这清楚地表明你真正想要的东西。 该vector<bool>
使用迭代时(因为它通常返回代理对象)优化实际上创建用于错误多种可能性,例如。
嗯,你总是可以考虑来与你的编译器的头文件。 由于STL容器几乎都是模板类,大多数,如果不是执行所有部分将在标题可见。
也许寻找一个vector
在调试对象也可以是有帮助的。
注意:您也应该知道, vector<bool>
的同时,而在由C ++社区皱起了眉头,而这种优化是大小,不求速度:
https://www.informit.com/guides/content.aspx?g=cplusplus&seqNum=98
有可能在编译时检查这一点,通过检查的非const版本的返回类型vector<bool>::operator[]
存储其值作为比特的实现必须返回一个代理引用类而比bool&
。
没什么好说的都在这里进行检查。 专业化vector<bool>
来存储比特,而不是较大的物体是由标准所要求的。 §23.2.5:“为了优化空间分配,载体为布尔元素的特化提供了:”。
我从一些观点想,你已经报价至少排序是正确的。 由于基本上是有没有人来证明一个编译器的一致性,并且基本上没有编译器,甚至试图满足所有的一致性要求,编译器可以选择忽略此要求也是如此。
我不知道这样做,但任何编译器 - 如果有人这样做,我猜它可能会相当知名。 已经有在时间有关删除相当热烈讨论vector<bool>
专业化,所以如果有人想了的是如何使事情更好(或更糟),我怀疑现实生活中的例子我们就已经听说了。
编辑:在C ++ 11,对于要求std::vector<bool>
已经被转移到§23.3.7。 更重要的是,措词已经被改变,以指定每个填充表示bool
被存储为单个位的,而不是一个连续分配bool
值现在只有一个建议。
至少IMO,这使得几乎没有真正的区别。 据我所知,所有真正的实现仍然使用打包表示,因此,即使打包的存储不再是理论上的保证,它在实践中发生的反正。
这个程序种prooves它。
#include <vector>
#include <iostream>
template <typename T>
void showSize() {
std::vector<T> myvec;
size_t capacity = myvec.capacity();
std::cout << "capacity: " << myvec.capacity() << std::endl;
std::cout << "size: " << myvec.size() << std::endl;
while (myvec.capacity() < 1024) {
while (myvec.capacity() == capacity) {
myvec.push_back(T());
}
capacity = myvec.capacity();
std::cout << "capacity: " << myvec.capacity() << std::endl;
std::cout << "size: " << myvec.size() << std::endl;
}
}
int main(int, char**) {
std::cout << std::endl << std::endl;
std::cout << "*********************" << std::endl << std::endl;
std::cout << "Booleans: " << std::endl << std::endl;
showSize<bool>();
std::cout << std::endl << std::endl;
std::cout << "*********************" << std::endl << std::endl;
std::cout << "Chars: " << std::endl << std::endl;
showSize<char>();
}
输出:
*********************
Booleans:
capacity: 0
size: 0
capacity: 64
size: 1
capacity: 128
size: 65
capacity: 256
size: 129
capacity: 512
size: 257
capacity: 1024
size: 513
*********************
Chars:
capacity: 0
size: 0
capacity: 1
size: 1
capacity: 2
size: 2
capacity: 4
size: 3
capacity: 8
size: 5
capacity: 16
size: 9
capacity: 32
size: 17
capacity: 64
size: 33
capacity: 128
size: 65
capacity: 256
size: 129
capacity: 512
size: 257
capacity: 1024
size: 513
所以关键是,对布尔变量的能力提高了64个项目在同一时间(INT的大小或我的机器)。 这暗示,它只是保留在同一时间只有8个字节。
创造了巨大的vector<bool>
和查看程序的内存使用情况。
或者干脆退房的源代码-你可以在偷看vector
头。