【问题标题】:std::vector<bool> guaranteed to default all entries to false?std::vector<bool> 保证默认所有条目为假?
【发布时间】:2014-04-10 09:15:11
【问题描述】:

我希望我的 std::vector 中的所有条目在我将其调整为所需的容器大小后都为 false。这似乎是测试的情况,但我似乎无法找到任何保证这种情况始终如此的文档。

我意识到我可以自己将所有内容都设置为 false,但如果已经保证每个条目都默认为 false,这似乎效率低下(它是一个大小合适的向量,将在数千个地方创建)。

对此有任何保证吗?提前致谢。

【问题讨论】:

    标签: c++ vector


    【解决方案1】:

    resize 将默认插入元素,按照 (C++11) 标准调用:

    allocator_traits&lt;bool&gt;::construct(m, p)

    其中m 是分配器,p 指向目标地址。

    这反过来(假设m 是标准分配器)调用

    m.construct(p)

    依次调用

    ::new((void *)p) bool()

    所以你的bool 最终会被值初始化,这对于bools 意味着零初始化,这意味着false

    如果m 是一个自定义分配器并且由于某种原因缺少construct(),它最终仍会被值初始化。


    正如已经指出的std::vector&lt;bool&gt; 不使用标准分配器,仍然resize() 被定义为

    void resize(size_type sz, bool c = false);

    所以结果是一样的。

    【讨论】:

    • 与其他向量不同,vector&lt;bool&gt; 不使用allocator_traits&lt;bool&gt;::construct
    • 好点...尽管它确实继续说所有操作都有相同的要求,所以至少结果是相同的。还是这样?
    • 根据cpprference's vector&lt;bool&gt; entry,“不使用std::allocator_traits::construct 来构造位值。”。我不会对你投反对票,但是没有其他方法可以撤消我对你的投赞成票,而答案是错误的......”
    • @TonyD 可以理解,我现在已经编辑了我的答案。为了将来参考,我认为您可以单击相同的箭头来撤消 +/-1。
    • @user657267: 最好将最相关的信息放在顶部,并在最后保留“BTW 用于除 bool 以外的类型的向量...”作为奖励部分。无论如何,我要+1,感谢您重新投票的提示……这很酷!干杯。
    【解决方案2】:

    是的,std::vector&lt;bool&gt; 是用零字节初始化的,在大多数机器上是 false(初始化 bool-s 的默认值)。

    查看std::vector上的说明

    【讨论】:

    • 老实说,从来没有注意到“如果没有使用自定义分配器初始化”,+1
    • bool(),默认值,在所有 c++ 系统上都是 false,而不是大多数。
    • @David:我认为它对 C++11 来说是新的,因为 C++03 只有单一版本resize(n, T default_value = T())。无论分配器如何,int() 都为零。
    【解决方案3】:

    在我看来,如果你使用:

    vec.resize(N, false);
    

    每个条目都应设置为false。这不是你需要的吗?

    此外,如果您不指定false,它将采用默认值,即false for bool

    【讨论】:

      【解决方案4】:

      不保证。最好有

      struct MYBOOL {
          int value;
          MYBOOL(bool v = false):value(v) {}
          operator bool(){return value;}
      };
      

      并将您的向量声明为:

      vector<MYBOOL> v(10); // presume size = 10
      

      当您访问向量中的某个元素时,例如 v[2],除非您执行以下操作,否则它肯定是假的:

      v[2] = true;
      

      在访问 v[2] 之前

      或使用 v.push_back(true);

      【讨论】:

      • 我猜不是原始类型 bool。你是说bool b吗?会保证 b 为假吗?我怀疑!
      • @DebasishJana 唯一的疑问会出现,因为std::vector&lt;bool&gt; 是一个奇怪的专业化,所以一些通常的规则不适用。但对于任何其他内置类型,元素都是零初始化的。
      • 但我认为原始类型没有构造函数来初始化
      • @DebasishJana:取决于上下文很多。确切的规则不适合注释,但基本上语法T foo = T() 初始化foo 而不管T 的类型,即使T 没有构造函数。这也是这里发生的情况:vector&lt;T&gt;::resize 的默认第二个参数是 T()
      猜你喜欢
      • 2017-05-22
      • 2018-02-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-08
      相关资源
      最近更新 更多