选择什么容器

时间:2011-04-08 17:44:40

标签: c++ boost map containers

我想过存放一些物品......现在我不知道该选择什么。

所以,现在我有了这样的代码:

std::map<std::string, Object*> mObjects;

但是,正如我之前所说的那样,由于在每次搜索中分配了std::string,所以它很慢,所以键应该是整数。

为什么我选择std::string作为关键?因为按名称访问对象非常容易,例如:

mObjects["SomeObj"];

所以我的第一个想法是:

std::map<int, Object*> mObjects;

和key是对象名称的CRC:

mObjects[CRC32("SomeObject")];

但它有点不稳定。我知道有特殊的哈希映射。 最后,我必须使用一些Compare函数在地图中对对象进行排序。

关于我可以使用的容器的任何想法?

再次,主要观点:

  • 按字符串访问对象,但键应为整数,而不是字符串
  • 通过某种功能对地图中的对象进行排序

P.S。提高使用率是允许的。

1 个答案:

答案 0 :(得分:0)

我不能肯定地说,但是你总是用文字字符串访问地图中的项目吗?如果是这样,那么您应该只使用具有符号名称的连续枚举值,并使用适当大小的vector

假设你不知道名字,直到地图中的1000个项目看起来真的很小,可能是一个瓶颈。您确定查找是性能问题吗?你有没有想过确保是这样的?一般来说,使用最直观的容器会产生更好的代码(因为你可以更容易地掌握算法)代码。

你对构造字符串的评论是否暗示你一遍又一遍地将C字符串传递给find函数?尝试在应用程序中始终使用std::string来避免这种情况。

如果您坚持使用两部分方法:我建议您将所有商品存储在vector中。然后你有一个unordered_map从字符串索引,另一个vector将所有索引放入主容器。然后,您对第二个索引容器进行排序,以获得所需的顺序。最后,当您从主容器中删除项目时,您需要清理其他两个引用容器。