shrink_to_fit()vs swap技巧

时间:2017-04-27 20:17:17

标签: c++ c++11 vector time-complexity big-o

我有一个游戏,其中某些游戏对象一次性产生,然后在它们被摧毁/杀死时消失。游戏对象是std::vector中的元素,我想最小化内存使用量。我习惯了交换技巧,

std::vector<gameObject>(gameObjectVector.begin(), gameObjectVector.end()).swap(gameObjectVector);

但我注意到C ++ 11中的内置shrink_to_fit()。但是,它具有线性复杂性,而交换技巧是不变的。交换技巧在各方面都不是优越的吗?

2 个答案:

答案 0 :(得分:16)

交换技巧实际上不是恒定时间。执行实际交换的成本确实是O(1),但是std::vector析构函数的成本会触发并清理所有已分配的空间。如果底层对象具有非平凡的析构函数,那么可能会花费Ω(n),因为std::vector需要去调用那些析构函数。还有为初始向量中存储的所有元素调用复制构造函数的成本,类似于Ω(n)。

因此,两种方法应该具有大致相同的复杂性,除了shrink_to_fit更明确地表达意图并且可能更适合编译器优化。

答案 1 :(得分:3)

在isocpp.org上也有特色的接受的答案是错误的。

shrink_to_fit nonbinding 要求。 我个人认为,将ISO视为非限制性(不提供对发生的事情提供更强有力的保证)是非常愚蠢的,因为它令人困惑,但也许他们有充分的理由(tm)。