【发布时间】:2018-03-02 02:26:38
【问题描述】:
我有一个算法,我目前使用两个无符号整数作为位图来存储有关输入的信息;这将最大输入大小限制为 64,因此我想创建一个版本,其中整数被替换为位集或简单的大整数。我开始使用vector
我需要的操作:
- 初始化为全零。
- 左移(乘以 2)并设置新的 lsb。
- 添加和设置 msb。
- 比较两个集合以首先找到最小/字典顺序。
创建它们时,我知道最大位数,但起初我只需要 1 位;然后,在每一步,一组左移,而另一组将添加一个新的最高位:
{
a <<= 1;
a[0] = x;
b[++msb] = y;
if (a < b) b = a;
}
如果我创建大小为 1 的位集,然后逐渐扩展它们,那么比较可能会比我立即将长度设置为最大值并可能有数千个前导零更快?
那么我应该继续使用vector
使用vector
std::vector<bool> a(0), b(0);
然后像这样执行上面提到的操作:
{
a.push_back(x);
b.insert(b.begin(), y);
if (a < b) b = a;
}
【问题讨论】:
-
我不确定您提到的任何容器是否支持您想要的全套操作,但那又如何?您可以使用标准容器之一来实现您自己的类(就像其他人建议的那样,我会避免使用
vector <bool>),然后根据情况更改实现。这难道不是面向对象编程应该做的事情之一吗? -
也许你应该看看GMP。
-
@JesperJuhl 或 boost.org/doc/libs/1_65_1/libs/multiprecision/doc/html/…(它还包装了其他库,如 GMP boost.org/doc/libs/1_65_1/libs/multiprecision/doc/html/…
-
对
vector<bool>的批评通常是它没有存储任何bools。这使得不可能满足容器的所有要求,尤其是返回引用为bool&。如果这对您来说不是问题,那么该类型就没有什么特别的问题了。
标签: c++ vector biginteger bitset std-bitset