【发布时间】:2014-01-11 20:34:46
【问题描述】:
我正在寻找需要满足这些要求的容器(针对游戏开发,尤其是实体管理):
- 快速迭代
- 没有存储元素的副本
- 指向元素的指针不会失效
- 移除和插入元素
例子:
Container<Entity> container;
// This pointer will always point to the player
Entity* player{new Entity};
container.add(player);
// Set some entities to "dead"
for(auto& e : container) if(e->type == "Enemy") e->die();
// Use erase-remove idiom on "dead" entities
container.cleanup();
// Player pointer is still valid
player->doSomething();
到目前为止,我已经尝试了两种不同的容器类型:
-
std::vector<std::unique_ptr<T>>- 缓存友好(快速迭代)
-
没有副本(感谢
std::unique_ptr) -
指针不会失效(感谢
std::unique_ptr)
...和...
-
std::list<T>- 缓存不友好(迭代速度较慢)
- 无副本
- 指针不会失效
即使看起来有悖常理,std::vector<std::unique_ptr<T>> 也比 std::list<T> according to my benchmarks 更高效。
(对于更大的类型,std::list<T> 在插入期间性能更高,但std::vector<std::unique_ptr<T>> 仍然胜出)。
我想知道是否有更好的替代 std::vector<std::unique_ptr<T>>。
理想情况下,替代方案应该是缓存友好,以便快速迭代,并允许用户在添加/删除现有项目后引用相同的项目(指针不应失效)。
【问题讨论】:
-
为什么你需要一个已经表现良好的vector的替代品?
-
你试过
std::deque吗?您将获得许多与std::vector相同的好处,但不需要大量连续内存来存储大量数据。 -
你要更频繁地执行什么操作?
-
我怀疑性能会更好,但你可以试试
boost::ptr_vector<T>。 -
@VittorioRomeo:如果您可以找到要创建的对象数量的上限,您可以使用某种Object Pool pattern 并避免拥有指针
标签: c++ performance c++11 vector containers