因为STL map内部使用的是红黑树.
map默认的比较器有Less,Greater等等,在查找一个值时,不能立刻找到与该元素值相等的元素,而是要遍历到树的叶节点,记录不小于(不大于)该值的元素,最后再做一次比较确定是否相等.
因为我们可以自定义比较器,比如string的比较,CEGUI中就用
stringFastLess<T>的仿函数(Functor),先比较字符串的长度,长度相同时再比较内容.因为长度是不需要实时计算的,所以这样大大提高了比较的速度.它的缺点是,插入顺序和比较顺序不是字典顺序.当然,最坏的情况下,所有字符串长度相等时.......
其实,一次字符串比较之后,大于,小于或者等于,结果已经完全出来了,自己写了一个map,而它默认比较器是这样:
- template<T>struct mapComparator
- {
- int operator()(const T& lhs,const T& rhs) const
- {
- if( lhs < rhs ) return -1;
- else if( lhs > rhs ) return 1;
- else return 0;
- }
- }
这个是通用的,效率很低,每个节点都要比较两次.但是对于字符串:
- struct stringComparator
- {
- int operator()(const string& lhs,const string& rhs) const
- {
- return strcmp(lhs.c_str(),rhs.c_str() );
- }
- }
甚至对于整数:
- struct intComparator
- {
- int operator()(const int& lhs, const int& rhs) const
- {
- return lhs -rhs;
- }
- }
呵呵,这样就可以就地找到匹配的值,而不需要遍历到叶子节点了.