在向量引用上调用vector :: reserve()

时间:2013-10-15 16:48:35

标签: c++ stl stdvector

我已经提出了一个解释现象的理论,但我希望有更多知识渊博的人来承担我的责任。

在客户端代码中,我有:

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!发生了什么?我正在使用64位Ubuntu 12.04上的CMake脚本调用gcc 4.6.3(但我认为所有这些实际上都无关紧要)。

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

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

1 个答案:

答案 0 :(得分:5)

你应该调用resize,而不是保留。

在此处查看差异: Choice between vector::resize() and vector::reserve()

编辑以回答以下评论:

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

长篇答案请阅读本文http://www.gotw.ca/gotw/074.htm

  

v.reserve(2);   v [0] = 1;   v [1] = 2;   上述两条线都是平坦的错误,但是   他们可能很难找到平坦的错误,因为他们很可能   在你的标准库实现方式之后“工作”。

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