我有一个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*
周围,不需要分配。这是一个好主意吗? (请注意,我的映射值不可复制,只能移动)。
答案 0 :(得分:1)
你可以通过使用0终止的字符串和地图的自定义比较器来避免临时
尽管如此,使用unordered_map
可能会产生更好的索引性能。
另一种选择(更好)是使用包装,就像你想的那样
该任务实际上已经std::reference_wrapper
。
仍然是优化的第一条规则:不要这样做
第二条规则:不这样做。
第三条规则(仅适用于专家):经过测量和仔细考虑,无论如何都可以这样做。
唯一的缺点是:你必须手动管理字符串的生命周期。
如果你要沿着这条路走下去,并且在释放所有字符串之前你没有释放任何字符串,请考虑使用自己的自定义分配器。