C ++清除或擦除矢量的最快方法

时间:2013-05-07 13:30:58

标签: c++ performance vector clear

我有一个代码,我常规填充0到5000个元素之间的向量。我知道最大值永远不会超过5000.而不是多次初始化矢量,我只想做一次

vector<struct> myvector;
myvector.reserve(5000);

然而,为了再次填充向量,我必须首先清除向量而不改变其容量。所以通常我会调用myvector.clear();

这是O(n)操作。是否有一些简单的方法可以提高它的性能,或者这是否会达到最佳效果?

3 个答案:

答案 0 :(得分:39)

如果你的结构有一个非平凡的析构函数,那么无论它如何被清空,都需要为向量的所有元素调用它。如果你的struct只有一个简单的析构函数,那么允许编译器或标准库实现优化掉销毁过程并给你一个O(1)操作。

答案 1 :(得分:24)

clear()的成本在很大程度上取决于存储的对象是什么,特别是它们是否具有普通的析构函数。如果类型没有一个简单的析构函数,那么调用必须销毁所有存储的对象,它实际上是一个O(n)操作,但你不能真正做更好的事情。

现在,如果存储的元素具有简单的析构函数,那么实现可以优化成本,clear()成为廉价的O(1)操作(只需重置大小 - end指针)。

请记住,要了解渐近复杂性,您需要知道它所涉及的内容。在clear()的情况下,它表示调用的析构函数的数量,但如果成本(隐藏)为0,则操作为无操作。

答案 2 :(得分:10)

您从向量中删除现有项目所做的任何操作都需要(可能)调用每个被销毁项目的析构函数。因此,从容器的角度来看,您可以期待的最好是线性复杂性。

只留下您在矢量中存储的项目类型的问题。如果你存储类似于int的东西,编译器可以/将提前知道没有析构函数可以调用,那么删除最终会导致复杂性不变的可能性至少相当不错。

然而,我怀疑改变语法(例如,clear()resize()erase(begin(), end()))会产生任何重大差异。语法不会改变(在没有线程的情况下)调用N个析构函数的事实是O(N)操作。