【问题标题】:Why does std::bitset only takes constexpr value?为什么 std::bitset 只取 constexpr 值?
【发布时间】:2020-06-13 19:36:49
【问题描述】:

我想在运行时决定 bitset 的大小。
但是std::bitset<N> 只接受 N 的 constexpr 值,甚至不接受 const 值。
这意味着必须在编译之前确定位集的大小。

我知道std::vector 为 bool 数组提供优化,
但它缺少我需要的那些有用的 bitset 成员。

问题 1:为什么 N 必须是 constexpr 值?
好吧,我猜那是因为 bitset 是模板,但是,这仍然是巨大的不便。
Bitset 可能是一个类,而不是一个模板。
它的构造函数可以将 size_t 作为参数,而不是我可以创建可变长度的位集。
std::array 也有同样的问题。
可能是std::array<type> foo(size, values)

问题 2:是否有任何“黑客”可以让我创建可变长度的位集?
考虑到模板的工作原理,我很确定不会有任何内容。
但也许,有一些聪明的把戏:)
如果没有,我将不得不使用 std::vector<bool> 并自己实现 bitset 成员。

【问题讨论】:

标签: c++ templates std bitset variable-length-array


【解决方案1】:

Bitset 可能是一个类而不是一个模板。

它是有目的的,如果那不是你的,你只需要使用不同的东西。

如果你想存储单个位,这意味着你喜欢存储可变大小的bool,你可以简单地使用std::vector< bool >

如果没有,我将不得不使用 std::vector 并自己实现 bitset 成员。

位集是位的容器。那么你自己实现 bitset 是什么意思?

【讨论】:

  • 我自己实现 bitset 是指 bitset 成员函数,如翻转、设置、重置、to_string 等。std::bitset 甚至支持按字符串或整数值初始化。 std::vector 没有,所以我必须自己制作。此外,“它是为某种目的而制造的”。好吧,至少让我知道那个目的是什么!历史原因?
  • “历史原因?”抓不住你的意思?你觉得模板是历史的吗?抱歉,不知道你的意图是什么……
  • 好的。对我来说,如果它是一个类,bitset 会更有用。但事实并非如此。所以为什么?有逻辑或历史原因吗?或者也许没有理由并且将来可能会改变?无论如何,看起来你也不知道,因为你的回答更像是“好吧,就这么处理吧”。我会处理它,但是嘿,我只是好奇:)
  • @Ultim8_Clock 使用模板的一般想法是启用所有可能的优化,如果所有参数都是运行时则无法完成。因此,这里模板的目的是尽可能快地访问单个位。如果使用诸如具有运行时可变大小的容器类之类的东西会更舒服,但肯定会降低速度。我和你一样,对于运行时变体具有相同的编译时间常量位集接口会很好。
【解决方案2】:

为什么 N 必须是 constexpr 值?

你是对的。 std::bitsetstd::array 的大小都指定为模板参数,因此在运行时无法设置。

然而,过去曾有一些提议在 C++ 标准中引入动态数组。其中之一被称为std::dynarray。最终,它不会被引入标准,但您可以看到 here 对其生命周期的更详细描述。

是否有任何“黑客”可以让我创建可变长度的位集?

如果您有权访问 Boost 库,则可以使用其dynamic_bitset

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-10-30
    • 1970-01-01
    • 2018-04-02
    • 2016-04-16
    • 2019-10-24
    • 2011-07-03
    • 2021-05-07
    • 2013-03-30
    相关资源
    最近更新 更多