1

我已经提出了一个解释现象的理论,但我希望有更博学的人来支持我。

在客户端代码中,我有:

vector<bool> candidates;
fillCandidates(candidates);

在被调用者中,我有:

void fillCandidates(vector<bool>& candidates)
{
    // reserve space for two elements
    candidates.reserve(2);
    candidates[0] = true;
    candidates[1] = false;
    // here, candidates.size() == 0
}

当我在函数返回后检查候选人的大小时,它是0!发生了什么?我在 Ubuntu 12.04 64 位上使用在 CMake 脚本中调用的 gcc 4.6.3(但我认为所有这些实际上都无关紧要)。

注意:我提供我的解释作为答案。

编辑:接受的答案和评论在时间上击败了我,所以我的解释不会添加任何东西。

4

1 回答 1

4

您应该调用调整大小,而不是保留。

在此处查看差异: vector::resize() 和 vector::reserve() 之间的选择

编辑以回答以下评论:

简短的回答是肯定的,在仅保留的向量上调用 operator[] 是错误的,任何事情都可能发生。

长答案是阅读这篇文章http://www.gotw.ca/gotw/074.htm

v.reserve(2); v[0] = 1;v[1] = 2; 上述两行都是完全错误,但它们可能是难以找到的完全错误,因为它们可能会在您实现标准库后“起作用”。

我建议阅读全文。在你的情况下,我会使用push_back而不是手动调整大小。但是,如果您真的担心,我会对性能进行基准测试。

于 2013-10-15T16:50:28.683 回答