【问题标题】:Standard way of getting a non-specialized std::vector<bool> container获取非专用 std::vector<bool> 容器的标准方法
【发布时间】:2018-03-27 09:57:35
【问题描述】:

是否有一种标准方式(或至少是半标准的,在所有流行的编译器中实现)来获得非专用、非优化、连续的std::vector&lt;bool&gt; 容器?

我有一些处理std::vectors 的通用代码,假设它们都是这样标准的、连续的容器。我目前的解决方法是使用 std::vector&lt;int&gt;,它只存储 0 和 1,这是我想要的内容,但拥有正确的矢量类型会更好。

【问题讨论】:

  • 至少,你可以通过使用std::vector&lt;char&gt; 来节省一些空间,因为char 的大小与bool 相同...
  • @Aconcagua - 不能保证bool 的大小与char 相同。
  • @StoryTeller 不符合标准,但在过去的 15 年里我从未见过其他任何东西......我们可以接受它作为 de facto 标准吗?跨度>
  • @Aconcagua - 不,我们不能。事实上,在访问单个字节的成本很高的系统上,将bool 设置为原生字长实际上是有意义的。
  • @StoryTeller 但至少绝对不会浪费空间,因为 char 是可能的最小类型。

标签: c++ vector c++17


【解决方案1】:

作为解决方法,您可以使用其他类型,char 出现在脑海中。 否则,您可以围绕 bool 编写一个包装器,例如:

struct my_bool
{
    operator bool() const { return b; }
    operator bool&() { return b; }

    bool b;
};

【讨论】:

    【解决方案2】:

    一般来说,使用std::vector&lt;bool&gt; 专业化并不是一个好的做法,当然也有例外。主要是因为它的接口和主std::vector&lt;T&gt;的接口不同,造成了很多混乱。

    在网络上散布的几篇出版物中都提到了这种不规则性。最近的一篇,恕我直言,一本好书是由 Howard Hinnant 写的,即On vector&lt;bool&gt;

    事实上,前一段时间有人提议将其从标准 N1185 中删除,但由于向后兼容性问题而被拒绝。

    大多数提议的半标准替代方案是使用std::vector&lt;unsigned char&gt;std::vector&lt;char&gt;

    【讨论】:

    • @AntonMalyshev 不是真的,至少不重要。我的猜测是 0 转换为 false 而任何数字 != 0 转换为 true 所以出于某种特殊原因,您需要排除负数。
    猜你喜欢
    • 2012-09-08
    • 1970-01-01
    • 2014-11-04
    • 2018-11-23
    • 2017-11-10
    • 1970-01-01
    • 1970-01-01
    • 2012-09-21
    相关资源
    最近更新 更多