C++ map
为了实现快速查找,map内部本身就是按序存储的(比如红黑树)。在我们插入<key, value>键值对时,就会按照key的大小顺序进行存储。Map的定义:
1 template < class Key, class T, class Compare = less<Key>, //入参为key 2 //键 值 用于key比较的函数对象,与相对的greater 3 class Allocator = allocator<pair<const Key,T> > > 4 //用于存储分配 5 class map;
其中less实现:
1 template <class T> 2 struct less : binary_function <T,T,bool> 3 { 4 bool operator() (const T& x, const T& y) const 5 {return x<y;} 6 };
对Key排序
由上可知,按key排序,只需自定义一个用于比较的类就ok了。
例如:
1 struct CmpByKeyLength 2 { 3 bool operator()(const string& k1, const string& k2) 4 { 5 return k1.length() < k2.length(); 6 } 7 }; 8 int main() 9 { 10 map<string, int, CmpByKeyLength> name_score_map; 11 name_score_map["LiMin"] = 90; 12 name_score_map.insert(make_pair("Bing",99)); 13 name_score_map.insert(make_pair("Albert",86)); 14 for (map<string, int>::iterator iter = name_score_map.begin(); 15 iter != name_score_map.end(); 16 ++iter) 17 { 18 cout << *iter << endl; 19 } 20 21 return 0; 22 }
对Value排序
对于value则既不能按Compare,也不可以用sort,因为sort只可用于序列(线性)容器,而map是集合容器(例如:红黑树)
Map中的元素类型为pair
1 template <class T1, class T2> struct pair 2 { 3 typedef T1 first_type; 4 typedef T2 second_type; 5 6 T1 first; //对应Key 7 T2 second; //对应Value 8 9 //构造函数 10 pair() : first(T1()), second(T2()) {} 11 pair(const T1& x, const T2& y) : first(x), second(y) {} 12 template <class U, class V> 13 pair (const pair<U,V> &p) : first(p.first), second(p.second) { } 14 }
此外,在<utility>头文件中,还为pair重载了 < 运算符
1 template<class _T1, class _T2> 2 inline bool operator < (const pair<_T1, _T2>& __x, const pair<_T1, _T2>& __y) 3 { 4 return __x.first < __y.first || //key不同 5 (!(__y.first < __x.first) && __x.second < __y.second); //key相同,则比较value 6 //为什么不用==呢?因为作为map的key必须实现<操作符的重载,至于==不能保证,而且浮点数… 7 }
所以用map + vector即可实现对value 的排序
例如:
1 typedef pair< int, int> PAIR; 2 bool cmp_by_value(const PAIR& lhs, const PAIR& rhs) { 3 return lhs.second < rhs.second; 4 } 5 struct CmpByValue { 6 bool operator()(const PAIR& lhs, const PAIR& rhs) { 7 return lhs.second < rhs.second; 8 } 9 }; 10 int main() { 11 map<int, int> myMap; 12 myMap [1] = 90; 13 myMap [2] = 79; 14 myMap.insert(make_pair(3,99)); 15 myMap insert(make_pair(4,86)); 16 //把map中元素转存到vector中 17 vector<PAIR> name_score_vec(myMap.begin(), myMap.end()); 18 sort(name_score_vec.begin(), name_score_vec.end(), CmpByValue()); 19 // sort(name_score_vec.begin(), name_score_vec.end(), cmp_by_value); 20 for (int i = 0; i != myMap.size(); ++i) { 21 cout << myMap [i] << endl; 22 } 23 return 0; 24 }
Sort算法如下:
1 template <class RandomAccessIterator> 2 void sort ( RandomAccessIterator first, RandomAccessIterator last ); 3 4 template <class RandomAccessIterator, class Compare> 5 void sort ( RandomAccessIterator first, RandomAccessIterator last, Compare comp );
posted on 2015-07-09 11:11 默默前行_huster 阅读(200) 评论(0) 编辑 收藏 举报