Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/143.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 是std::vector的用法<;布尔>;C++;可以接受,还是我应该使用替代方案?_C++_Stl_Vector_Boolean_Bitset - Fatal编程技术网

C++ 是std::vector的用法<;布尔>;C++;可以接受,还是我应该使用替代方案?

C++ 是std::vector的用法<;布尔>;C++;可以接受,还是我应该使用替代方案?,c++,stl,vector,boolean,bitset,C++,Stl,Vector,Boolean,Bitset,我使用的是用户定义数量的位(我持有一个三维位数组,因此大小按立方增加——假设不少于512位),并且需要分别翻转它们。现在,就在电脑上,我使用的是bool类型,因为内存不是问题。我确实计划在将来将代码转移到微控制器上,因此处理能力和内存需求可能是一个问题。但现在,我只想要速度 然后,我从中找到了std::bitset对象,但无法在运行时定义位集的大小。然后我发现std::vector有一个特殊的初始值设定项将它们存储为位(而不是整个字节或4个字节),但后来在Wikipedia中发现: 标准库定义了

我使用的是用户定义数量的位(我持有一个三维位数组,因此大小按立方增加——假设不少于512位),并且需要分别翻转它们。现在,就在电脑上,我使用的是
bool
类型,因为内存不是问题。我确实计划在将来将代码转移到微控制器上,因此处理能力和内存需求可能是一个问题。但现在,我只想要速度

然后,我从中找到了
std::bitset
对象,但无法在运行时定义位集的大小。然后我发现
std::vector
有一个特殊的初始值设定项将它们存储为位(而不是整个字节或4个字节),但后来在Wikipedia中发现:

标准库定义了
向量
模板的专门化 对于
bool
。此专门化的描述表明 实现应该打包元素,以便每个
bool
只使用 一点内存。这被广泛认为是一个错误。在C++标准委员会和图书馆工作组之间普遍存在一个共识:<代码>向量<代码>应该被删除,随后从标准库中删除,而功能将以不同的名称重新引入。

现在,你可能会看到我想要使用
向量
对象,但在读了之后,我正在考虑使用其他东西。唯一的问题是我不知道该用什么。我很好奇为什么他们说应该重新引入该功能(尽管名称不同)

因此,我的问题是,使用
vector
对象是否可以接受(因为它们是STL的一部分)?它们是C++标准的一部分吗?< /P>
如果它们的使用是不可接受的,是否有一个可接受的替代解决方案(我自己定义了一个特殊的容器)?我自己也有一些想法,但我只是好奇是否有人有更好的解决方案。此外,我希望避免使用大型库(同样,我希望最终将此代码移植到微控制器)。

有一个与std::bitset几乎相同的库,只是它的大小是在运行时给定的。如果您对boost依赖性不感兴趣,那么它的源代码(完全包含在它的头文件中)至少可以提供关于如何编写此类容器的更多想法。

向量没有什么问题,只是它不等价于向量
如果t是等价于bool的整数类型。这仅在性能上显示(CPU一次仅访问字节,在
向量中,每个元素存储在一位中)和内存访问(对
向量的第一个元素的引用
与任何其他
向量
不等同于数组)


不幸的是,它是标准的一部分:请参见第23.3.7节(C++0x FDIS)。

正确使用
向量没有什么错,就像
自动ptr
没有错一样,只要在继续之前知道缺点和惊喜。

,Scott Meyers建议:“避免使用向量

作为STL容器,它实际上只有两个问题 vector。首先,它不是STL容器。其次,它不是 等等,除此之外,没什么可反对的


另一种可能是,尽管我不确定它是否适用于x86以外的任何其他体系结构(它使用SIMD进行了大量优化)。

批评是,
vector
是唯一一个不完全符合标准容器要求的标准容器。这有点令人惊讶

另一点是
vector
强制每个人进行空间优化(通过存储位),而有些用户可能更喜欢速度优化

除此之外,主要的偏差是容器不能返回对其成员的引用,因为它不存储任何布尔值。这将使奇数标准库算法无法为
向量
编译


如果你能接受它,并且它符合你对其他一切的需求,那么使用它是很好的。

我建议使用这个库,作为Boost:dynamic_bitset的替代。可以找到一个比较调查。

谢谢你的回答,我改变了我的问题,以更准确地反映我选择512的原因(我使用的网格是8x8x8,但它可以定义为任何大小,因此元素的数量[以及内存需求]会以立方体的方式增加)@Breakdown Nevermind我在512上的笔记,但是在这个潜在的大型3D阵列中,数据有任何内部结构吗?也许还有其他数据结构可以利用它,比如和朋友们?+1,你的答案没有错,我真的很欣赏这些替代数据类型,但是@rubenvb发布了一个answ呃,这更符合我所寻找的。我不认为在这种情况下使用树,因为我不会执行任何二进制搜索。但是,我确实需要以不特定的顺序几乎立即访问此数组中的任何元素……仅使用例如
vec[bit>>3]|=(1vector是针对空间而不是速度进行优化的。而且它也不像vector那样确认容器语义。确实如此。如果
vector
对您有效,请使用它。它是标准的一部分。如果安全使用,将来删除专门化时最糟糕的情况不是您的代码会崩溃,而是它会出现错误D只使用更多的RAM。不要使用。它在C++11中被弃用,在C++17中被删除。