如何清除载体但保持其容量?

for*_*818 17 c++ vector

我试图修复一些使用向量的代码,并且有一些循环看起来像这样:

for (int t=0;t<T;t++){    
    std::vector<double> vect;
    for (int i=0;i<MAX;i++){
        double value;
        vect.push_back(value);
    }
    /*....*/
}
Run Code Online (Sandbox Code Playgroud)

我或多或少知道如何通过重复使用相同的向量进行外部迭代来改进这一点,但在这样做时我发现当调用std::vector::clear "向量容量不能保证改变"时,我实际上希望能够保证容量不要改变 也许我只是误解了cplusplus.com上的内容.但是,我的问题是:

如何在不改变容量的情况下清除矢量?

我应该叫reserveclear,以确保产能一样吗?

PS:为了清楚,我想重写上面的代码

std::vector<double> vect;
vect.reserve(MAX);
for (int t=0;t<T;t++){    
    for (int i=0;i<MAX;i++){
        double value;
        vect.push_back(value);
    }
    /*....*/
    vect.clear();
}
Run Code Online (Sandbox Code Playgroud)

即.我仍然希望填充它push_back,我担心clear()改变矢量的容量.

Ale*_*zzi 12

cppreference明确表示载体的容量不变.

来自cppreference(大胆强调它是我自己):

void clear();
Run Code Online (Sandbox Code Playgroud)

从容器中删除所有元素.使引用包含元素的任何引用,指针或迭代器无效.可能使任何过去的迭代器无效.
使向量的容量()保持不变.

编辑

正如Dmitry Kuznetsov在评论中指出的那样,该标准没有提到容量:

表达: a.clear()

返回类型: void
断言/注释前/后条件:销毁a中的所有元素.使引用a元素的所有引用,指针和迭代器无效并且可能使过去的迭代器无效.

post: a.empty()返回true.

复杂性:线性.


Sam*_*hik 3

是的,reserve()之后打电话clear()。在最坏的情况下,您将发生一次解除分配/分配,这对于 POD 向量的影响可以忽略不计。