我正在尝试修复一些使用向量的代码,并且有一些循环看起来像这样:
for (int t=0;t<T;t++){
std::vector<double> vect;
for (int i=0;i<MAX;i++){
double value;
vect.push_back(value);
}
/*....*/
}
我或多或少知道如何通过在外部迭代中重复使用相同的向量来改进这一点,但是在执行此操作时我发现在调用std::vector::clear
"the vector capacity is not guaranteed to change"时,我实际上希望能力保证不会改变。也许我只是误解了cplusplus.com上的内容。但是,我的问题是:
如何在不更改容量的情况下清除矢量?
我应该在reserve
之后致电clear
以确保容量相同吗?
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();
}
即。我仍然希望通过push_back
填写它,我担心clear()
会更改向量的容量。
答案 0 :(得分:9)
cppreference明确表示载体的容量不变。
来自cppreference(粗体强调它是我自己):
void clear();
从容器中删除所有元素。使任何引用无效, 指向包含元素的指针或迭代器。可能会失效 任何过去的迭代器。
保持向量的容量()不变。
修改强>
正如Dmitry Kuznetsov在评论中所指出的,standard没有提及能力:
表达式:
a.clear()
返回类型:
void
断言/注释前置/后置条件:销毁a中的所有元素。使引用的所有引用,指针和迭代器无效 a的元素可能使过去的迭代器无效。post: a.empty()返回true。
复杂性:线性。
答案 1 :(得分:4)
是的,请在reserve()
之后致电clear()
。在最坏的情况下,您将进行单次释放/分配,这对于POD向量的影响可以忽略不计。
答案 2 :(得分:3)
您可以存储从capacity()
返回的值并使用reserve()
方法。
我们无法保证为您提供完全相同的capacity:
将容器的容量增加到更高或更高的值 等于new_cap。如果new_cap大于当前容量(), 分配了新的存储空间,否则该方法无效。
int main()
{
vector<int> vec { 1,2,3,4,5 };
size_t cap = vec.capacity();
vec.clear();
vec.reserve(cap);
cout << "vec capacity: " << vec.capacity() << '\n';
}
答案 3 :(得分:-1)
调用clear
将解除分配(不一定,但取决于实现),然后调用resize
将导致代价高昂的重新分配。显而易见的答案是迭代矢量并将结果设置为0 / NULL
:
for(double& d : vect)
{
d = 0;
//d = NULL, depending on datatype
}
这将只是“清除”向量而无需昂贵的重新分配。当然,这个过程的性能在很大程度上取决于元素的数量 - 这只是一个简单的方法。
答案 4 :(得分:-1)
另一种方法是做一个交换技巧......
std::vector<double> vect = {0.1, 0.2, 0.3}
{
std::vector<double> swapVector;
swapVector.reserve(vect.capacity());
vect.swap(swapVector); // swapVector now has the elements of vect
// vect has only reserved elements
} // swapVector will be destroyed (including the elements that was in vect)
std::cout << vect.capacity();