我知道这个问题可能听起来很奇怪,但是有一些遗留代码,其中有一个unordered_map,其中std :: string键的最大大小为8 + 1(1为空终止)。
我在char [8]变量中收到一个字符串,我不想仅仅为find()调用strcpy到temp std :: string。
有没有办法以某种方式实现一些比较器,所以我可以直接在find()调用中使用char [8]?
请记住char [8]可能包含类似“12345678”(没有空终止)的内容,因此默认的strcmp可能不起作用,尽管strncmp可能会这样吗?
答案 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
进行比较。