在std :: map <string,anydatatype =“”>中,密钥是如何存储的?

时间:2015-06-16 04:40:36

标签: c++ stl

基本上我想知道的是,如果密钥存储为:

  1. 字符串本身,在这种情况下,比较会花费很多时间。
  2. 散列值,在这种情况下,BST搜索可能不正确,因为字符串的散列值可能与字符串本身的排序顺序不同。

2 个答案:

答案 0 :(得分:2)

template < class Key, class T, class Compare = less<Key>, class Alloc = allocator<pair<const Key,T> > > class map;

您可以看到std::map模板最多可以包含4个参数,但只需要2个参数。第三个是比较对象,它是std::map用来比较和按Key对其元素进行排序的对象。默认情况下,map使用less<Key>对象,在TL:DR字中,与<运算符相同。

如果你好奇,这是它的定义:

template <class T> struct less {
  bool operator() (const T& x, const T& y) const {return x<y;}
  typedef T first_argument_type;
  typedef T second_argument_type;
  typedef bool result_type;
};

答案 1 :(得分:1)

  

基本上我想知道的是,如果密钥存储为:

     

1.String本身,在这种情况下比较会花费很多时间。

如上所述。 (std::map<>不对任何东西使用哈希值)。是否花费大量时间取决于具有长共享前缀的相同长度字符串的数量:对于例如可能是坏的相同长度的文件名 - 深度嵌套 - 目录。如果您愿意,可以自定义比较功能(例如,向后比较,或通过比较字符串中N个均匀间隔的字符来快速检查不相等的字符串)。如果您在字符串比较速度方面遇到严重问题,可能还需要考虑map<string, map<string, X>>,其中外部string是已知的长且重共享前缀。存储将string与哈希值包装在一起的类型 有助于快速识别不匹配的字符串,如果哈希是高质量的,那么使用它就好像是无冲突的平等一样。

其他容器也值得一看。