我应该使用位集还是矢量? 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::vectorstd::bitset 的值类型。使用这种方法,您可以将 "binary numbers" 视为字符串或某种整数类型的对象,同时很容易进行二进制操作,如设置或重置位。

这完全取决于你想做什么二进制文件。

您也可以使用 boost.dynamic_bitset,它类似于 std::bitset,但不是固定位。 如果您还没有使用它,主要缺点是依赖于 boost。

您还可以将输入存储在 std::vector<char> 中,并使用每个 char 的位集来转换二进制表示法。

正如其他人所说:std::bitset 使用固定位数。

std::vector<bool> 并不总是被推荐,因为它有它的怪癖,因为它不是真正的容器 (gotw)。

如果您对需要存储的数字的大小没有任何特定的上限,那么您需要在两个不同的维度上存储数据:

  • 第一个维度是数字,大小不一。
  • 第二个维度将是您的数字数组。

对于后者,如果您需要您的值在内存中是连续的,则使用 std:vector 就可以了。对于数字本身,您根本不需要任何数据结构:只需使用 new 和无符号原始类型(例如 unsigned charuint8_t 或任何其他具有对齐约束的类型分配内存.

另一方面,如果您知道您的数字不会大于 64 位,则使用您知道可以容纳此数据量的数据类型,例如 uint64_t

PS:记住你存储的是数字。无论您直接使用它们还是以任何其他表示形式使用它们,计算机都会以二进制形式存储它们。