std :: map,其char [5]键可能包含空字节

时间:2011-05-24 21:47:53

标签: c++ stl char stdmap

密钥是二进制垃圾,我只将它们定义为char,因为我需要一个1字节的数组。
它们可能包含null个字节。

现在的问题是,当我有两个密钥时:ab(0)aab(0)b(0)null字节),map将它们视为字符串,认为它们相等,我没有得到两个唯一的map条目。

解决这个问题的最佳方法是什么?

4 个答案:

答案 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];
  }
};