shrink_to_fit()vs swap技巧

And*_*oen 13 c++ big-o vector time-complexity c++11

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

std::vector<gameObject>(gameObjectVector.begin(), gameObjectVector.end()).swap(gameObjectVector);
Run Code Online (Sandbox Code Playgroud)

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

tem*_*def 16

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

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


NoS*_*tAl 7

在 isocpp.org 上也有推荐的已接受答案是错误的。

shrink_to_fit是非约束性要求。我个人认为 ISO 将其保留为非投标是愚蠢的(没有对发生的事情提供一些更有力的保证),因为它令人困惑,但也许他们有很好的理由(tm)。

  • 我认为构造函数对“容量”也没有约束力,尽管我还没有检查标准来确定。如果给定的迭代器不是随机访问,则必须如此,尽管有理由在实现中重载它,但我怀疑标准要求这样做。 (2认同)