我希望将std :: vector中的所有条目调整为假,然后将其调整为所需的容器大小。这似乎是测试的情况,但我似乎无法找到任何保证始终如此的文档。
我意识到我可以将自己设置为假,但如果已经保证每个条目默认为false(这是一个体面的大小的矢量,并且将在数千个地方创建),这似乎效率低下。
这有什么保证吗?提前谢谢。
答案 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
,则会采用默认值,false
为bool
。
答案 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);