密钥是二进制垃圾,我只将它们定义为char
,因为我需要一个1字节的数组。
它们可能包含null
个字节。
现在的问题是,当我有两个密钥时:ab(0)a
和ab(0)b
((0)
是null
字节),map
将它们视为字符串,认为它们相等,我没有得到两个唯一的map
条目。
解决这个问题的最佳方法是什么?
答案 0 :(得分:2)
为什么不使用std::string
作为密钥:
//must use this as:
std::string key1("ab\0a",4);
std::string key2("ab\0b",4);
std::string key3("a\0b\0b",5);
std::string key4("a\0\0b\0b",6);
第二个参数应该表示c-string的大小。以上所有都使用了这个构造函数:
string ( const char * s, size_t n );
description就是这样:
内容初始化为由s指向的字符数组中前n个字符组成的字符串副本。
答案 1 :(得分:1)
使用std::array<char,5>
或甚至更好(如果您真的想要将密钥作为二进制值处理)std::bitset
答案 2 :(得分:1)
如果您真的想使用char[5]
作为密钥,请考虑编写自己的比较类来正确比较密钥。 map
类需要其中一个才能组织其内容。默认情况下,它使用的是不适用于您的密钥的版本。
以下是the map class上显示map
参数的页面。您需要编写自己的Compare
类来替换less<Key>
,这是map
的第三个模板参数。
答案 3 :(得分:0)
如果您只需要区分它们并且不依赖于字典顺序,则可以将每个键视为uint64_t。这样做的好处是,您可以通过hashmap实现轻松替换std :: map,并且您无需手动执行任何操作。
否则你也可以这样编写自己的比较器:
class MyKeyComp
{
public:
operator()(char* lhs, char* rhs)
{
return lhs[0] == rhs[0] ?
(lhs[1] == rhs[1] ?
(lhs[2] == rhs[2] ?
(lhs[3] == rhs[3] ? lhs[4] < rhs[4])
: lhs[3] < rhs[3])
: lhs[2] < rhs[2])
: lhs[1] < rhs[1])
: lhs[0] < rhs[0];
}
};