我已经提出了一个解释现象的理论,但我希望有一个知识渊博的人来承担我.
在客户端代码中,我有:
vector<bool> candidates;
fillCandidates(candidates);
Run Code Online (Sandbox Code Playgroud)
在被叫方,我有:
void fillCandidates(vector<bool>& candidates)
{
// reserve space for two elements
candidates.reserve(2);
candidates[0] = true;
candidates[1] = false;
// here, candidates.size() == 0
}
Run Code Online (Sandbox Code Playgroud)
当我在函数返回后检查候选人的大小时,它是0!发生了什么?我正在使用64位Ubuntu 12.04上的CMake脚本调用gcc 4.6.3(但我认为所有这些实际上都是无关紧要的).
注意:我提供了我的解释作为答案.
编辑:接受的答案和评论在时间上打败了我,所以我的解释不会添加任何东西.
你应该调用resize,而不是保留.
在这里看到差异: vector :: resize()和vector :: reserve()之间的选择
编辑以回答以下评论:
简短的回答是肯定的,在一个只保留的向量上调用operator []是一个错误,任何事情都可能发生.
答案很长,请阅读http://www.gotw.ca/gotw/074.htm
v.reserve(2); v [0] = 1; v [1] = 2; 上述两行都是平坦的错误,但它们可能很难找到平坦的错误,因为它们可能会在您执行标准库之后"工作".
我建议阅读整篇文章.在你的情况下,我会使用push_back而不是手动调整大小.但如果你真的担心,我会对性能进行基准测试.