我有一个游戏,特定的游戏对象同时产卵,然后当它们被摧毁/杀死时就绝望了。游戏对象是std::vector中的元素,我希望将内存使用量降到最低。我习惯了交换技巧,
std::vector<gameObject>(gameObjectVector.begin(), gameObjectVector.end()).swap(gameObjectVector);但是我注意到了来自C++11的内置C++11,但是它具有线性复杂性,而交换技巧是常量的。交换技巧不是各方面都有优势吗?
发布于 2017-04-27 20:20:38
交换技巧实际上不是固定时间。执行实际交换的成本确实是O(1),但是还有std::vector析构函数触发和清理所有分配空间的成本。如果底层对象具有非平凡的析构函数,这可能会花费Ω(n),因为Ω需要调用这些析构函数。还需要为存储在初始向量中的所有元素调用副本构造函数,这类似于Ω(n)。
因此,这两种方法应该具有大致相同的复杂性,除了shrink_to_fit更清楚地传达了意图,并且可能更容易对编译器进行优化。
发布于 2017-05-03 05:18:42
接受的答案,也得到了isocpp.org的功能是错误的。
shrink_to_fit是非约束性的需求。就我个人而言,我认为ISO把它保留为非投标(没有对发生的事情提供更有力的保证)是愚蠢的,因为这是令人困惑的,但也许他们有很好的理由(Tm)。
https://stackoverflow.com/questions/43667175
复制相似问题