使用向量存储实体

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

【讨论】:

以上是关于使用向量存储实体的主要内容,如果未能解决你的问题,请参考以下文章

Word2Vec 和 Glove 向量是不是适合实体识别?

实体链接(Entity Linking)依存句法分析成分句法树词袋模型文本向量空间模型(TF-IDF)

数据存储区 - 如果您删除一个实体,将来是不是可以在新创建的实体上重复使用它的实体 ID?

如何使用 JPA 存储通用实体?

一个存储实体属性是不是只能映射到EF中的一个类实体属性?

使用实体框架核心生成和访问存储过程