我应该使用位集还是矢量? C++
should I use a bit set or a vector? C++
我需要能够在 C++ 中存储二进制数数组,这些数组将通过不同的方法传递并最终输出到文件和终端,
向量和位集之间的主要区别是什么,哪个最简单and/or使用效率更高?
(不知道要存多少位)
如果您不知道在编译时需要存储多少位,则不能使用 bitset,因为它的大小是固定的。因此,您应该 vector<bool>
,因为它可以动态调整大小。如果你想像这样保存一个位数组,你可以使用 vector< vector<bool> >
.
std::bitset
大小应该在编译时就知道了,所以你的选择很明显——使用std::vector<bool>
。
由于它的实现与 std::vector<char>
不同(因为单个元素需要一点,而不是一个完整的字符),它在内存使用方面应该是一个很好的解决方案。
我认为在你的情况下你应该使用 std::vector
和 std::bitset
的值类型。使用这种方法,您可以将 "binary numbers" 视为字符串或某种整数类型的对象,同时很容易进行二进制操作,如设置或重置位。
这完全取决于你想做什么二进制文件。
您也可以使用 boost.dynamic_bitset,它类似于 std::bitset
,但不是固定位。
如果您还没有使用它,主要缺点是依赖于 boost。
您还可以将输入存储在 std::vector<char>
中,并使用每个 char
的位集来转换二进制表示法。
正如其他人所说:std::bitset
使用固定位数。
std::vector<bool>
并不总是被推荐,因为它有它的怪癖,因为它不是真正的容器 (gotw)。
如果您对需要存储的数字的大小没有任何特定的上限,那么您需要在两个不同的维度上存储数据:
- 第一个维度是数字,大小不一。
- 第二个维度将是您的数字数组。
对于后者,如果您需要您的值在内存中是连续的,则使用 std:vector
就可以了。对于数字本身,您根本不需要任何数据结构:只需使用 new
和无符号原始类型(例如 unsigned char
、uint8_t
或任何其他具有对齐约束的类型分配内存.
另一方面,如果您知道您的数字不会大于 64 位,则使用您知道可以容纳此数据量的数据类型,例如 uint64_t
。
PS:记住你存储的是数字。无论您直接使用它们还是以任何其他表示形式使用它们,计算机都会以二进制形式存储它们。
我需要能够在 C++ 中存储二进制数数组,这些数组将通过不同的方法传递并最终输出到文件和终端,
向量和位集之间的主要区别是什么,哪个最简单and/or使用效率更高?
(不知道要存多少位)
如果您不知道在编译时需要存储多少位,则不能使用 bitset,因为它的大小是固定的。因此,您应该 vector<bool>
,因为它可以动态调整大小。如果你想像这样保存一个位数组,你可以使用 vector< vector<bool> >
.
std::bitset
大小应该在编译时就知道了,所以你的选择很明显——使用std::vector<bool>
。
由于它的实现与 std::vector<char>
不同(因为单个元素需要一点,而不是一个完整的字符),它在内存使用方面应该是一个很好的解决方案。
我认为在你的情况下你应该使用 std::vector
和 std::bitset
的值类型。使用这种方法,您可以将 "binary numbers" 视为字符串或某种整数类型的对象,同时很容易进行二进制操作,如设置或重置位。
这完全取决于你想做什么二进制文件。
您也可以使用 boost.dynamic_bitset,它类似于 std::bitset
,但不是固定位。
如果您还没有使用它,主要缺点是依赖于 boost。
您还可以将输入存储在 std::vector<char>
中,并使用每个 char
的位集来转换二进制表示法。
正如其他人所说:std::bitset
使用固定位数。
std::vector<bool>
并不总是被推荐,因为它有它的怪癖,因为它不是真正的容器 (gotw)。
如果您对需要存储的数字的大小没有任何特定的上限,那么您需要在两个不同的维度上存储数据:
- 第一个维度是数字,大小不一。
- 第二个维度将是您的数字数组。
对于后者,如果您需要您的值在内存中是连续的,则使用 std:vector
就可以了。对于数字本身,您根本不需要任何数据结构:只需使用 new
和无符号原始类型(例如 unsigned char
、uint8_t
或任何其他具有对齐约束的类型分配内存.
另一方面,如果您知道您的数字不会大于 64 位,则使用您知道可以容纳此数据量的数据类型,例如 uint64_t
。
PS:记住你存储的是数字。无论您直接使用它们还是以任何其他表示形式使用它们,计算机都会以二进制形式存储它们。