【发布时间】:2014-04-10 09:15:11
【问题描述】:
我希望我的 std::vector 中的所有条目在我将其调整为所需的容器大小后都为 false。这似乎是测试的情况,但我似乎无法找到任何保证这种情况始终如此的文档。
我意识到我可以自己将所有内容都设置为 false,但如果已经保证每个条目都默认为 false,这似乎效率低下(它是一个大小合适的向量,将在数千个地方创建)。
对此有任何保证吗?提前致谢。
【问题讨论】:
我希望我的 std::vector 中的所有条目在我将其调整为所需的容器大小后都为 false。这似乎是测试的情况,但我似乎无法找到任何保证这种情况始终如此的文档。
我意识到我可以自己将所有内容都设置为 false,但如果已经保证每个条目都默认为 false,这似乎效率低下(它是一个大小合适的向量,将在数千个地方创建)。
对此有任何保证吗?提前致谢。
【问题讨论】:
resize 将默认插入元素,按照 (C++11) 标准调用:
allocator_traits<bool>::construct(m, p)
其中m 是分配器,p 指向目标地址。
这反过来(假设m 是标准分配器)调用
m.construct(p)
依次调用
::new((void *)p) bool()
所以你的bool 最终会被值初始化,这对于bools 意味着零初始化,这意味着false。
如果m 是一个自定义分配器并且由于某种原因缺少construct(),它最终仍会被值初始化。
正如已经指出的std::vector<bool> 不使用标准分配器,仍然resize() 被定义为
void resize(size_type sz, bool c = false);
所以结果是一样的。
【讨论】:
vector<bool> 不使用allocator_traits<bool>::construct。
vector<bool> entry,“不使用std::allocator_traits::construct 来构造位值。”。我不会对你投反对票,但是没有其他方法可以撤消我对你的投赞成票,而答案是错误的......”
是的,std::vector<bool> 是用零字节初始化的,在大多数机器上是 false(初始化 bool-s 的默认值)。
查看std::vector上的说明
【讨论】:
bool(),默认值,在所有 c++ 系统上都是 false,而不是大多数。
resize(n, T default_value = T())。无论分配器如何,int() 都为零。
在我看来,如果你使用:
vec.resize(N, false);
每个条目都应设置为false。这不是你需要的吗?
此外,如果您不指定false,它将采用默认值,即false for bool。
【讨论】:
不保证。最好有
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);
【讨论】:
std::vector<bool> 是一个奇怪的专业化,所以一些通常的规则不适用。但对于任何其他内置类型,元素都是零初始化的。
T foo = T() 初始化foo 而不管T 的类型,即使T 没有构造函数。这也是这里发生的情况:vector<T>::resize 的默认第二个参数是 T()。