2016-11-22 100 views
0

我需要能够在C++中存储二进制数组,它将通过不同的方法传递并最终输出到文件和终端,我应该使用一个位集还是一个向量? C++

向量和位集之间的关键区别是什么?最简单和/或更有效的使用?

(我不知道我需要多少位来存储)

+3

你可能会过问你的问题([XY](http://xyproblem.info/)?)。提示:计算机内部的所有数字都是二进制的;无论如何, – Drop

+1

bitsets是编译时确定的大小。 – jaggedSpire

+0

你还提到一个'数组' - 你有一个固定大小的数字集合吗?你想用他们做什么? – doctorlove

回答

1

这一切都取决于你想做什么二进制。

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

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

正如其他人已经告诉:std :: bitset使用固定的位数。

std::vector<bool>并不总是建议,因为它有它的怪癖,因为它如果你没有任何具体的上限,你需要存储的数字的大小是不是真正的容器(gotw

0

如果你不知道你需要多少位在编译时存储,您不能使用bitset的,因为它的大小是固定的。正因为如此,你应该vector<bool>,因为它可以动态调整大小。如果你想要这样保存一些位,你可以使用vector< vector<bool> >

+0

惊讶这么多人都推荐'矢量'。 –

1

std::bitset尺寸在编译时应该知道,所以你的选择很明显 - 使用std::vector<bool>。 由于它的实现与std::vector<char>不一样(因为单个元素需要一点点,而不是一个完整的char),它应该是内存使用方面的一个很好的解决方案。

+2

注意使这种高效的专业化,并阅读文档。它确实打破了一些关于矢量如何表现的假设。 –

0

我认为在你的情况下,你应该使用std::vector的值类型std::bitset。使用这种方法,您可以将“二进制数”视为字符串或某些整数类型的对象,同时可以轻松执行二进制操作,如设置或重置位。

+0

我不认为这是可能的,因为他不知道他需要存储多少比特。 –

+0

@HonzaDejdar所有整数类型都有固定的位数。所以没有问题。:) –

+0

如果他不需要存储更大的数字,比肯定。我从OP那里想到,他根本不知道他需要存储多少比特。 –

0

,然后您需要将数据存储在两个不同的维度中:

  • 第一维将是数量,其大小会变化。
  • 第二维将是你的数组数组。

对于后者,如果要求值在内存中是连续的,则使用std:vector就可以了。对于数字本身,您根本不需要任何数据结构:只需使用new和无符号基元类型(如unsigned char,uint8_t或其他任何其他值)分配内存(如果有对齐限制)。

另一方面,如果您知道您的数字不会超过64位,那么请使用您知道将存储此数据量的数据类型,例如uint64_t。 PS:记住你存储的是数字。计算机会将它们存储为二进制文件,无论您是使用它们还是使用其他任何表示形式。

相关问题