c++ - shrink_to_fit() 与交换技巧

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

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

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

但我注意到了来自 C++11 的内置 shr​​ink_to_fit()。但是,它具有线性复杂性,而交换技巧是恒定的。交换技巧不是在各方面都优越吗?

最佳答案

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

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

关于c++ - shrink_to_fit() 与交换技巧,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43667175/

相关文章:

c++ - 非常大数的对数

C++ int浮点转换

c++ - std::basic_ifstream 抛出 std::bad_cast

c++ - 何时使用 vector 中的对象以及何时使用指向 vector 中对象的指针?

C++ std::push_heap 破坏堆/不尊重比较器

c++ - 放置和非放置分配器

c++ - 使用可变模板参数解析 lambda 签名

c++ - 调用函数并传递存储在元组中的参数?

c++ - ifstreams 和 rdbuf() 的奇怪行为

c++ - 使用基于范围的 for 循环将对象 emplace_back 到 vector 中的正确方法是什么? C++