具有char [5]键的std :: map可能包含空字节

|| 这些键是二进制垃圾,我只将它们定义为
char
,因为我需要一个1字节的数组。 它们可能包含1个字节。 现在的问题是,当我有两个键:
ab(0)a
ab(0)b
(0)
是a1ѭ字节)时,
map
将它们视为字符串,认为它们相等,而我没有得到两个唯一的
map
条目。 解决此问题的最佳方法是什么?     
已邀请:
为什么不使用
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 ( const char * s, size_t n );
描述如下:   内容被初始化为由s指向的字符数组中前n个字符组成的字符串的副本。     
使用
std::array<char,5>
甚至可能更好(如果您真的想将键作为二进制值处理)
std::bitset
    
如果您确实想使用
char[5]
作为键,请考虑编写自己的比较类以正确地在键之间进行比较。
map
类要求其中之一来组织其内容。默认情况下,它使用的版本与您的密钥不兼容。 这是地图类上的页面,其中显示了
map
的参数。您想编写自己的
Compare
类来代替
less<Key>
,后者是
map
的第三个模板参数。     
如果只需要区分它们并且不依赖于字典顺序,则可以将每个键都视为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];
  }
};
    

要回复问题请先登录注册