【问题标题】:convert vector<bool> to int将向量<bool> 转换为 int
【发布时间】:2014-09-19 14:33:19
【问题描述】:

我有一个 vectorbool,我想将其复制到更大尺寸的 int 容器中。有没有快速的方法来做到这一点?

澄清一下,有没有更聪明的方法来实现这一点?

#include <vector>
#include <cstdint>
#include <iostream>
#include <climits>
#include <cassert>


inline size_t bool2size_t(std::vector<bool> in) {
    assert(sizeof(size_t)*CHAR_BIT >= in.size());
    size_t out(0);

    for (size_t vecPos = 0; vecPos < in.size(); vecPos++) {
        if (in[vecPos]) {
            out += 1 << vecPos;
        }
    }

    return out;
} 

int main () {
    std::vector<bool> A(10,0);
    A[2] = A[4] = 1;

    size_t B = bool2size_t(A);

    std::cout << (1 << 2) + (1 << 4) << std::endl;
    std::cout << B << std::endl;
}

我正在寻找类似 @​​987654325@ 的东西,我可以在子字节级别上使用它。

【问题讨论】:

  • 您想将一个向量复制到另一个向量吗?
  • 根据您是否需要动态大小的容器,您应该考虑使用 std::bitset 代替它的 to_ulong() 方法。
  • 我不想将vector&lt;bool&gt; 的内存复制到设置为零的int 中。重要的是它的大小可能不能被 8 整除。
  • @staticx: vector&lt;bool&gt;,不幸的是,它并不是真正的vector。其中,您是否可以从中获得ForwardIterator 是由实现定义的......
  • 使用 C++11,您可能可以在布尔向量上使用 std::hash() 来实现您想要的。

标签: c++ memcpy


【解决方案1】:

这是一个使用 C++11 的示例:

#include <vector>
#include <iostream>
#include <numeric>

using namespace std;

int main() {
    vector<bool> b(10,0);
    b[2] = b[4] = 1;
    int i;
    i = accumulate(b.rbegin(), b.rend(), 0, [](int x, int y) { return (x << 1) + y; });
    cout << i << endl;
}

另一个使用 GCC 内部结构的解决方案 vector&lt;bool&gt; 更高效:

#include <vector>
#include <iostream>
#include <algorithm>

using namespace std;

int main() {
    vector<bool> b(10,0);
    b[2] = 1;
    b[4] = 1;
    auto p = b.begin()._M_p;
    cout << *p << endl;
}

请注意,虽然不建议使用vector&lt;bool&gt;,因为它是vector&lt;T&gt; 的一个有问题的特化,并且API 略有不同。我建议改用 vector&lt;char&gt;,或者创建自己的 Bool 包装类,并隐式转换为 bool

【讨论】:

  • 你确定这会奏效吗?我曾经被教导要远离任何与vector&lt;bool&gt;相关的迭代器...
  • 我没有做任何性能评估,但这不是和循环一样慢吗?也许我错了,我误解了一些东西。
  • 你是对的,它可能会很慢。我认为“更聪明的方式”是指更短,而不是更快。
  • @magu_ - 我添加了一个更有效的解决方案。它只适用于 gcc。
  • 请注意,该解决方案是特定于实现的,并且可能无法跨编译器移植。例如,clang不会编译该代码
【解决方案2】:

实现可以将vector&lt;bool&gt; 存储为您想要的位设置,但不是必须这样做。如果您可以更改类型,请查看 bitset 模板类,它的工作方式相同,但实现了例如to_ulong.

this question

编辑:如果Boost 可以,则有dynamic_bitset,如果您需要存储超过unsigned long 可以容纳的数量,它将为您进行分块。

【讨论】:

  • 嗯,我试图避免使用 bitset,因为我需要动态分配向量。是否可以动态分配位集 - 我不需要调整它的大小。
  • 好吧,一个无符号长整数只能保存 64 位。如果超过了,则必须使用其他方法,例如将它们分块。
  • 嗯,没错。我真的不想使用boost。但我可能会简单地实现bitset&lt;sizeof(size_t)*CHAR_BIT&gt; 并忍受开销。幸运的是,没有那么多人同时记住它们。
猜你喜欢
  • 1970-01-01
  • 2017-02-24
  • 1970-01-01
  • 2015-12-01
  • 2011-09-28
  • 1970-01-01
  • 2015-07-27
  • 1970-01-01
  • 2011-09-17
相关资源
最近更新 更多