基本上我想知道的是,如果密钥存储为:
答案 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
与哈希值包装在一起的类型
有助于快速识别不匹配的字符串,如果哈希是高质量的,那么使用它就好像是无冲突的平等一样。
其他容器也值得一看。