-1

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

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

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

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

4

2 回答 2

2

如果你的 map 类型使用一个 key 类型,std::string你将无法避免构造 a 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::stringchar数组创建并依赖于正在使用的小字符串优化(即只复制字符而不分配内存)。

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

于 2012-01-19T23:57:01.267 回答
1

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

于 2012-01-19T23:27:55.690 回答