2012-01-19 27 views
-1

我知道这个问题可能听起来很奇怪,但有一些遗留代码,其中有一个unordered_map其中的std :: string键最大大小为8 + 1(1表示空终止)。C++自定义比较器之间std ::字符串和潜在的非空终止字符数组为unordered_map ::找到

我正在接受char [8]变量中的字符串,我不希望将strcpy仅用于find()调用的temp std :: string。

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

请记住,字符[8]可能包含类似“12345678”(无空终止),所以默认的strcmp可能不会工作,虽然也许strncmp会?

+3

在64位机器上,您可以一次复制8个字符。你(微)有多少优化呢? –

+0

正确。 'strncmp(lhs.data(),rhs,8)'是你想要使用的基础。 –

+0

你在使用boost :: unordered_map吗? –

回答

1

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

+0

请注意,您可能不想比较谓词。也就是说,你不想重载'operator ==()',而是重载函数operator operator()()'。可能的,成员函数应该是'const'。这就是说,我认为这不会奏效...... –

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字符串传递给此将导致有趣的行为。就我个人而言,我可能会创建一个帮助函数,该函数从char数组中创建std::string,并依赖于正在使用的小字符串优化(即字符只被复制而不是分配内存)。

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