map的成員函數(shù)沒有提供這一功能,對于這個問題,我首先想到的方法是,循環(huán)遍歷一下,將其中每個元素和比較對象進行比較,就可以了,代碼如下(為了方便說明,我將key的類型定義為int,對于其他類型的或是自定義類型的,可能需要自己寫比較函數(shù))
1 map<int, int>testMap;
2
3 for (int i = 1; i < 11; ++i)
4 {
5 testMap.insert(make_pair(i, i+100));
6 }
7
8 int nCount = 0;
9 for (itor = testMap.begin(); itor != testMap.end(); ++itor)
10 {
11 if (itor->first < 5)
12 {
13 ++nCount;
14 }
15 }
但是,在網(wǎng)上常看到很多高手都會給我們這樣的忠告,在處理STL容器的時候,盡量不要自己去寫循環(huán)處理。
在STL中,count_if這個算法,正符合我們的要求,而我們只需要提供比較函數(shù)就可以了,代碼如下:
1 template<class key, class Value>
2 class cmp_less
3 {
4 public:
5 cmp_less(key K)
6 :nKey(K)
7 {
8
9 }
10
11 bool operator()(pair<key, Value> elems)
12 {
13 if (elems.first < nKey)
14 {
15 return true;
16 }
17 else
18 {
19 return false;
20 }
21 }
22 private:
23 key nKey;
24 };
25
26 nCount = count_if(testMap.begin(), testMap.end(), cmp_less<int, int>(5));
文章寫到這里也能結(jié)束了,但這幾天在看bind2nd這個仿函數(shù)和別人文章的時候,想改用bind2nd試試,也看看自己掌握的情況,不用不知道,在寫代碼的時候才發(fā)現(xiàn)自己掌握的比較膚淺,嘗試了大半天,侯捷老師的STL源碼剖析一書也翻了好幾次,總算寫出來,代碼如下:
1 template<class Key, class Value>
2 class myless : public binary_function<pair<Key, Value>, Key, bool>
3 {
4 public:
5 bool operator()(pair<Key, Value> elemnt, Key other) const
6 {
7 if (elemnt.first < other)
8 {
9 return true;
10 }
11 else
12 {
13 return false;
14 }
15 }
16 };
17
18 nCount = count_if(testMap.begin(), testMap.end(), bind2nd(myless<int, int>(), 5));
在這之前我寫出了這樣的代碼,
1 nCount = count_if(testMap.begin(), testMap.end(), bind2nd(less<pair<int, int>>(), make_pair(5, 100)));
這樣也可以比較,但有個問題,因為這樣寫是兩個pair比較,而pair比較是這樣的,請看源代碼:
1 template<class _Ty1, class _Ty2>
2 inline bool operator<(const pair<_Ty1, _Ty2>& _Left, const pair<_Ty1, _Ty2>& _Right)
3 { // test if _Left < _Right for pairs
4 return (_Left.first < _Right.first ||
5 !(_Right.first < _Left.first) && _Left.second < _Right.second);
6 }
不僅比較key,還要比較value,這樣必須把右邊pair的value的值設(shè)的夠大才行,這不符合我們要求,我們只要求key做比較。
bind2nd源代碼是這樣的,請看:
1 template<class _Fn2, class _Ty>
2 inline binder2nd<_Fn2> bind2nd(const _Fn2& _Func, const _Ty& _Right)
3 { // return a binder2nd functor adapter
4 typename _Fn2::second_argument_type _Val(_Right);
5 return (std::binder2nd<_Fn2>(_Func, _Val));
6 }
我們注意到這句代碼typename _Fn2::second_argument_type _Val(_Right);
就是右邊的值(即做比較的值)要能向_Fn2::second_argument_type轉(zhuǎn)換,而且是由_Fn2提供的,_Fn2::second_argument_type是什么呢,請看
1 template<class _Arg1, class _Arg2, class _Result>
2 struct binary_function
3 { // base class for binary functions
4 typedef _Arg1 first_argument_type;
5 typedef _Arg2 second_argument_type;
6 typedef _Result result_type;
7 };
first_argument_type是左邊參數(shù)類型,second_argument_type是右邊參數(shù)類型,由于是map左邊是pair,右邊我們要求是key的類型,即int,所以我們
的定義這樣的
1 template<class Key, class Value>
2 class myless : public binary_function<pair<Key, Value>, Key, bool>
3 
就這三個方法,個人感覺還是第二個比較好。