Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/126.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 选择什么容器_C++_Boost_Map_Containers - Fatal编程技术网

C++ 选择什么容器

C++ 选择什么容器,c++,boost,map,containers,C++,Boost,Map,Containers,我想储存一些物品。。。现在我不知道该选什么了 所以,现在我有了这样的代码: std::map<std::string, Object*> mObjects; 所以我的第一个想法是: std::map<int, Object*> mObjects; 但它有点不稳定。我知道有专门的哈希映射。 最后,我必须使用一些Compare函数对地图中的对象进行排序 关于我可以使用的容器有什么想法吗 因此,重点是: 按字符串访问对象,但键应为整数,而不是字符串 通过某些函数对地图中的

我想储存一些物品。。。现在我不知道该选什么了

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

std::map<std::string, Object*> mObjects;
所以我的第一个想法是:

std::map<int, Object*> mObjects;
但它有点不稳定。我知道有专门的哈希映射。 最后,我必须使用一些
Compare
函数对地图中的对象进行排序

关于我可以使用的容器有什么想法吗

因此,重点是:

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

p、 boost的使用是允许的。

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

假设在运行时之前您不知道名称,那么地图中的1000个项目对于搜索来说似乎非常小,这可能是一个瓶颈。您确定查找是性能问题吗?你有没有分析过以确保情况属实?通常,使用最直观的容器将产生更好的代码(因为您可以更容易地掌握算法)

您关于构造字符串的评论是否意味着您将C字符串一次又一次地传递给find函数?通过在应用程序中一致地使用
std::string
来避免这种情况


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

我不能确定,但是您总是通过文本字符串访问映射中的项目吗?如果是这样,那么您应该只使用具有符号名的连续枚举值,以及大小适当的
向量

假设在运行时之前您不知道名称,那么地图中的1000个项目对于搜索来说似乎非常小,这可能是一个瓶颈。您确定查找是性能问题吗?你有没有分析过以确保情况属实?通常,使用最直观的容器将产生更好的代码(因为您可以更容易地掌握算法)

您关于构造字符串的评论是否意味着您将C字符串一次又一次地传递给find函数?通过在应用程序中一致地使用
std::string
来避免这种情况


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

在说它慢之前,您是否先使用字符串键测量性能?字符串是由于运行时限制而必需的,还是编译时所有值都已知,并且可以用常量替换,例如:
const int SOME_OBJECT=1。。。mObject[一些对象]…
@thanatos不,他们不能。有近1000个对象。你能使用
无序的
地图吗?你可以查看Boost.MultiIndex,它允许你在同一个容器中以各种方式索引项目。您可以使用散列索引进行快速搜索,使用有序索引进行排序。在说它慢之前,您是否先使用字符串键来衡量性能?是由于运行时的限制而需要字符串,还是编译时所有值都是已知的,并且可以替换为常量,例如:
const int SOME_OBJECT=1。。。mObject[一些对象]…
@thanatos不,他们不能。有近1000个对象。你能使用
无序的
地图吗?你可以查看Boost.MultiIndex,它允许你在同一个容器中以各种方式索引项目。您可以使用散列索引进行快速搜索,使用有序索引进行排序。我称之为搜索,每11毫秒搜索大约250个对象。这是个小数目?并且每~11ms对它们进行一次迭代。我想,boost::multiindex就是我所需要的。您能发布一个用于搜索/迭代映射的代码吗,因为(如果我正确理解数字的话)时间非常长。您是否构建代码的发布版本,有时调试版本非常慢。@如果您没有在地图上使用
std::find
,是吗?地图呢。我称之为搜索,每11毫秒搜索大约250个对象。这是个小数目?并且每~11ms对它们进行一次迭代。我想,boost::multiindex就是我所需要的。您能发布一个用于搜索/迭代映射的代码吗,因为(如果我正确理解数字的话)时间非常长。您是否构建代码的发布版本,有时调试版本非常慢。@您没有在地图上使用
std::find
,是吗?
std::map<int, Object*> mObjects;
mObjects[CRC32("SomeObject")];