std :: vector <bool>保证将所有条目默认为false?</bool>

时间:2014-04-10 09:15:12

标签: c++ vector

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

我意识到我可以将自己设置为假,但如果已经保证每个条目默认为false(这是一个体面的大小的矢量,并且将在数千个地方创建),这似乎效率低下。

这有什么保证吗?提前谢谢。

4 个答案:

答案 0 :(得分:21)

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

allocator_traits<bool>::construct(m, p)

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

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

m.construct(p)

反过来调用

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

因此,bool最终会被初始化,bool s表示零初始化,这意味着false

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


正如已经指出std::vector<bool>不使用标准分配器,仍将resize()定义为

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

所以结果是一样的。

答案 1 :(得分:3)

在我看来,如果你使用:

vec.resize(N, false);

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

此外,如果您未指定false,则会采用默认值,falsebool

答案 2 :(得分:3)

是的,std::vector<bool>初始化为零字节,在大多数机器上为false(初始化bool - s的默认值)。

请参阅std::vector

上的说明

答案 3 :(得分:-3)

不保证。

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

将你的矢量声明为:

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

当您访问向量中的某个元素时,比如v [2],除非您执行以下操作,否则它将保证为false:

v[2] = true;

访问v [2]之前

或使用v.push_back(true);