【问题标题】:Operator &= for elements of vector<bool> not defined? [duplicate]vector<bool> 元素的运算符 &= 未定义? [复制]
【发布时间】:2023-04-01 05:41:02
【问题描述】:

我用operator &amp;= 做了一些测试。如以下示例所示,这适用于单个 bool 类型以及 vector&lt;int&gt; 类型,但不适用于 vector&lt;bool&gt;

#include <vector>
int main (){

    bool a, b;
    a &= b; // ok
    std::vector<bool> c(1);
    c[0] &= b; // error
    c[0] = c[0] & b; // ok
    std::vector<int> d(1);
    d[0] &= b; // ok

    return 0;
}

谁能告诉这里发生了什么?

(我使用的是 gcc 4.4.3)

【问题讨论】:

    标签: c++


    【解决方案1】:

    vector&lt;bool&gt; is not a container actually 。 :P

    文章说

    (如果其他人写过向量,它会被称为“不合格”和“非标准”。嗯,它在标准中,所以在这一点上称呼它有点困难,但有些我们中的一些人无论如何都会尝试,希望它最终会被清理掉。正确的解决方案是删除向量专业化要求,以便向量真的是普通旧布尔值的向量。此外,它大多是多余的:std::bitset 是为这种事情。) ....

    std::vector 不符合标准的原因是它隐藏了一些技巧以尝试优化空间:而不是为每个 bool 存储一个完整的 char 或 int(至少占用8 倍空间,在具有 8 位字符的平台上),它会打包布尔值并将它们作为单独的位(例如,字符内部)存储在其内部表示中。这样做的一个后果是它不能只从它的 operator[] 或其取消引用的迭代器 [2] 返回一个普通的 bool&;相反,它必须使用类似于 bool 但绝对不是 bool 的助手“代理”类来玩游戏。不幸的是,这也意味着对向量的访问更慢,因为我们必须处理代理而不是直接指针和引用。

    【讨论】:

      【解决方案2】:

      这样做的原因是vector&lt;bool> 在标准中被明确调用为每个项目只占用一位。

      这样做的结果是operator[] for vector&lt;bool&gt; 返回一个代理对象,而不是像所有其他包含类型一样的直接引用。然后代理对象不支持operator&amp;=(尽管我没有参考,但很可能是每个标准)。

      如果您想为每个项目使用一个字节并让运算符按预期工作,您可以使用deque&lt;bool&gt;

      【讨论】:

      • +1 用于实际回答问题。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-02
      • 1970-01-01
      • 1970-01-01
      • 2015-09-07
      • 1970-01-01
      相关资源
      最近更新 更多