C++ C++;无序_map::find的std::string和可能以非null结尾的字符数组之间的自定义比较器

C++ C++;无序_map::find的std::string和可能以非null结尾的字符数组之间的自定义比较器,c++,comparator,stdstring,unordered-map,strcmp,C++,Comparator,Stdstring,Unordered Map,Strcmp,我知道这个问题听起来可能很奇怪,但是有一些遗留代码,其中有一个无序的_映射,其中std::string键的最大大小为8+1(空终止为1) 我在char[8]变量中接收到一个字符串,我不希望仅为find()调用将其strcpy到temp std::string 有没有办法实现一些比较器,这样我就可以在find()调用中直接使用char[8]了 请记住,char[8]可能包含类似“12345678”(无空终止)的内容,因此默认strcmp可能无法工作,尽管strncp可能会创建一个comparato

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

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

有没有办法实现一些比较器,这样我就可以在find()调用中直接使用char[8]了


请记住,char[8]可能包含类似“12345678”(无空终止)的内容,因此默认strcmp可能无法工作,尽管strncp可能会创建一个comparator类,该类对
操作符==
具有多个重载,并采用
char*
const string&
参数的每个组合。在字符串上使用
c_str()
方法,并与
strncmp

进行比较,如果映射类型使用的键类型为
std::string
,则无法避免构建
std::string
,这与是否使用
std::map
无关(参见23.4.4.1第2段中的签名)或
std::unordered_map
(参见23.5.4.1第3段中的签名):
find()
的参数是
键类型常量&
。尝试将以非null结尾的C字符串传递给此将导致有趣的行为。就个人而言,我可能会创建一个helper函数,该函数从
char
数组创建
std::string
,并依赖所使用的小字符串优化(即,仅复制字符而不是分配内存)


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

在64位机器上,您可以在一次移动中复制8个字符。你(微)优化了多少?正确
strncmp(lhs.data(),rhs,8)
是您想要使用的基本内容。您使用的是boost::无序映射吗?请注意,您可能不想比较谓词。也就是说,您不希望重载
操作符==()
,而是希望重载函数调用操作符
operator()()
。可能,成员函数应该是
const
。也就是说,我认为这是行不通的。。。