我有一个简单的用例:解析标头。我必须解析很多这些标头,并且保证有一个标头不重复任何字段。
在解析这些标头时,我将它们组织在std::map
// pseudo code
std::map<std::string,std::string> x;
x[key] = value;
// etc.
我已经简化了代码,最慢的一点是这些标头的地图插入。具体来说,是在将项目插入地图时调用的std::_Rb_tree_iterator
内部方法。使用gprof进行基准测试表明,在读入这些标头时(仅在仅中调用此方法(而在可能从地图中插入或删除项目的任何其他操作中未调用)时,调用此方法大约需要大约。我的运行时间的50%。
问题在于:假设我可以保证地图上所有条目的唯一性,是否有办法禁用std::_Rb_tree_iterator
来简化地图插入?
我宁愿运行慢速代码,也不愿使用std::map
以外的东西,除非替换具有等效的api(即,迭代器产生std::pair<std::string,std::string>
)。
答案 0 :(得分:5)
std::map
的插入速度很慢,因为它试图平衡二进制搜索树。使用std::unordered_map
使用哈希表;虽然它不会使元素保持排序,但是插入元素会快很多,因此强烈建议您不需要对元素进行排序。
此外,尝试使用insert
调用进行插入; []
将首先创建一个空元素,然后在其上编写您自己的元素。