std :: string as map key和map.find()的效率

时间:2014-04-25 01:19:05

标签: c++ string map

我有一个std::map<std::string,foo>并且需要经常find()个元素,而不是std::string,我有一个const char*。但是,map.find("key_value")无效,我需要std::string。所以,我需要map.find(std::string{"key_value"}),但每次都会创建一个临时的std::string(分配和取消分配),这可能会导致效率低下。这个推理是否正确?如果是,我该如何改善这种情况?

我考虑使用const char*周围的包装器作为地图的关键,该地图具有自己的比较功能,并且可以廉价地包裹在任何const char*周围,不需要分配。这是一个好主意吗? (请注意,我的映射值不可复制,只能移动)。

1 个答案:

答案 0 :(得分:1)

你可以通过使用0终止的字符串和地图的自定义比较器来避免临时 尽管如此,使用unordered_map可能会产生更好的索引性能。

另一种选择(更好)是使用包装,就像你想的那样 该任务实际上已经std::reference_wrapper

仍然是优化的第一条规则:不要这样做 第二条规则:这样做。
第三条规则(仅适用于专家):经过测量和仔细考虑,无论如何都可以这样做。

唯一的缺点是:你必须手动管理字符串的生命周期。

如果你要沿着这条路走下去,并且在释放所有字符串之前你没有释放任何字符串,请考虑使用自己的自定义分配器。