用于unordered_map :: find的std :: string和潜在的非null终止字符数组之间的C ++自定义比较器

时间:2012-01-19 23:24:11

标签: c++ comparator stdstring unordered-map strcmp

我知道这个问题可能听起来很奇怪,但是有一些遗留代码,其中有一个unordered_map,其中std :: string键的最大大小为8 + 1(1为空终止)。

我在char [8]变量中收到一个字符串,我不想仅仅为find()调用strcpy到temp std :: string。

有没有办法以某种方式实现一些比较器,所以我可以直接在find()调用中使用char [8]?

请记住char [8]可能包含类似“12345678”(没有空终止)的内容,因此默认的strcmp可能不起作用,尽管strncmp可能会这样吗?

2 个答案:

答案 0 :(得分:2)

如果地图类型使用密钥类型std::string,您将无法避免构建std::string,而与您是否使用std::map<std::string, T>无关(请参阅23.4中的签名)。 4.1第2段)或std::unordered_map<std::string, T>(见23.5.4.1第3段中的签名):find()的论点是key_type const&。尝试将非空终止的C字符串传递给此将导致有趣的行为。就个人而言,我可能会创建一个辅助函数,它从std::string数组创建char并依赖于正在使用的小字符串优化(即只复制字符而不是分配内存)。

如果分析显示这确实是性能问题,我可能会创建一个简单的固定大小常量字符串类,并将其用作关联容器的键:实际需要的少数操作并不是很难实现。

答案 1 :(得分:1)

operator==创建一个具有多个重载的比较器类,同时获取char*const string&个参数的每个组合。在字符串上使用c_str()方法,并与strncmp进行比较。