使用向量存储实体
Posted
技术标签:
【中文标题】使用向量存储实体【英文标题】:using vector to store entites 【发布时间】:2016-10-31 06:50:51 【问题描述】:我正在制作一个小游戏,并尝试使用矢量作为容器来存储世界上的所有实体。但是我需要一种经常插入和删除实体的方法。 我目前正在使用它来删除实体:
std::swap(m_entities[index], m_entities.back());
m_entities.pop_back();
但我无法检查项目是否存在,因此如果我不小心尝试删除项目,它会崩溃。索引也存储在实体中,因此索引对交换的实体无效,对吗? 我应该改用 unordered_map 吗?
【问题讨论】:
你可以使用vector::erase()
。附:我喜欢你的用户名。
vector::erase
似乎更合理,但请查看vector::at
以了解何时要测试自己是否在界限内。或者只是if (index <m_entities.size())
vector 可能不是正确的容器,因为游戏会发生大量插入/删除。这是因为vector 必须始终确保具有连续数据(以便可以像旧的 C 数组一样访问它)。也许看看我对相关问题的回答c-storing-an-object-into-an-array-of-objects-within-the-constructor-of-that-object
乍一看,您最后的思考似乎很合适。 unordered_map<index_type, std::shared_ptr<entity_type>>
似乎可以更好地完成这项任务。是否还有其他可能不是可靠候选人的原因留给您,因为我们没有太多工作要做。我强烈建议你放弃原始指针存储并进入现代 C++ 智能指针领域,顺便说一句。
最后一行应该在那里。您刚刚通过弹出它从背面删除了该项目。为什么要删除移到旧位置的值?
【参考方案1】:
您应该分析容器的实际使用情况,然后参考基准,例如这个:
http://baptiste-wicht.com/posts/2012/12/cpp-benchmark-vector-list-deque.html
更一般的 STL 复杂性页面在这里:
https://john-ahlgren.blogspot.de/2013/10/stl-container-performance.html
【讨论】:
以上是关于使用向量存储实体的主要内容,如果未能解决你的问题,请参考以下文章
实体链接(Entity Linking)依存句法分析成分句法树词袋模型文本向量空间模型(TF-IDF)