我在互联网上看到,如果您要重复std::vector
(紧密循环),最好使用resize(0)
代替clear()
,因为它可能是快点。我不确定这一点。有没有人对此有明确的答案?
答案 0 :(得分:20)
我认为你的意思是resize(0)
而不是setsize
,而是调用而不是clear()
,并且你在谈论std::vector
。 IIRC最近的回答讨论了这个问题(无法找到链接),在现代STL实施中,clear()
可能与resize(0)
相同。
以前清除向量可能已释放所有内存(即,其容量也降至零),当您再次开始添加元素时会导致重新分配,而resize(0)
保留容量以便重新分配更少。但是,我认为在现代STL库中没有区别。如果您使用旧的STL实现,或者您只是偏执,resize(0)
可能会更快。
答案 1 :(得分:3)
查看Dinkumware STL源,两者都有效地调用erase(begin(), end());
clear()
稍微提高效率,不足为奇,因为它只有一个案例需要处理。但我不希望它是可测量的。
答案 2 :(得分:1)
这个声音实现具体,是您,您的图书馆和探查器的工作。但是正如我所看到的,我无法理解为什么resize(0)应该更快,因为它们实际上都必须调用erase(begin(),end())。
答案 3 :(得分:1)
当向量包含没有默认构造函数的类的对象时,clear和resize(0)之间似乎有区别。例如,以下代码将编译:
#include <vector>
class A {
private:
int x,y;
public:
A(int x,int y) :x(x), y(y) {}
};
int main() {
std::vector <A> aa;
aa.clear();
}
但如果您用aa.clear()
替换aa.resize(0)
,则会出现编译错误:
error: no matching function for call to 'A::A()'