我正在寻找一个容器(针对游戏开发,特别是实体管理),它需要满足以下要求:
- 快速迭代
- 不复制存储的元素
- 不会使指向元素的指针失效
- 可以移除和插入元素
示例:
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>
在我的基准测试中性能更好。
(对于更大的类型,std::list<T>
在插入时性能更好,但std::vector<std::unique_ptr<T>>
仍然胜出)。
我想知道是否有更好的替代std::vector<std::unique_ptr<T>>
的方法。
理想情况下,这种替代方法应该是缓存友好的,能够快速迭代,并且在添加/删除现有项后仍允许用户引用相同的项(指针不应失效)。
std::deque
吗?它可以带来与std::vector
相同的许多好处,但对于大量数据不需要大量连续的内存。 - Zac Howlandboost::ptr_vector<T>
。 - Benjamin Lindley