InputIteratorfind_if(InputIteratorfirst,InputIteratorlast,Predicatepred){for(;first!=last;first++)if(pred(*first))break;returnfirst;}【例1】對第三參數的處理例子,第三參數" />

亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

容器find_if函數定義和其第三個參數重載的疑問

系統 1821 0

  簡單明了,這個是cpluscpus 對find_if的定義:

            
              1
              
2
3
4
5
6
            
              
                template
              
              <
              
                class
              
               InputIterator, 
              
                class
              
               Predicate>

  InputIterator find_if ( InputIterator first, InputIterator last, Predicate pred )

  {

    
              
                for
              
               ( ; first!=last ; first++ ) 
              
                if
              
               ( pred(*first) ) 
              
                break
              
              ;

    
              
                return
              
               first;

  }
            
          

  【例1】對第三參數的處理例子,第三參數就是一函數名。。。

            
              

class CPerson
{
public:
?CPerson(int a)
?{
??age = a;
?}
public:
?int age; // 年齡
};

?struct finder_t
{
?finder_t(int n) : age(n)
?{ }
?bool operator()(CPerson *p)
?{ return (age == p->age); }
?int age;
};

int main(void)
{
?list<CPerson*> lst;
?CPerson a(10),b(20),c(30);

?lst.push_back(&a);
?lst.push_back(&b);
?lst.push_back(&c);

?//finder_t t(30);
//?cout << finder_t(51) << endl;
?list<CPerson*>::iterator it = find_if(lst.begin(), lst.end(), finder_t(30)); // 查找年齡為50的人
?if (it != lst.end()) // 找到了
?{
??cout << "Found person with age : " << (*it)->age;
?}
?else // 沒找到
?{
??cout <<"is not find!"<<endl;
?}
?getchar();
?return 0;
}

?
?
1 -- find_if的STL定義

template < class InputIterator, class Predicate>
InputIterator find_if(InputIterator first, InputIterator last,Predicate pred)
{
?????? while (first != last && !pred(*first)) ++first;
?????? return first;
}

find_if是一個模板函數,接受兩個數據類型:InputItearator迭代器,Predicate用于比較數值的函數或者函數對象(仿函數)。find_if對迭代器要求很低,只需要它支持自增操作即可。當前遍歷到的記錄符合條件與否,判斷標準就是使得pred()為真。至此可能還有些不是很明了,下面舉幾個例子實際操練下的它的用法。

2 -- find_if在std::map查找時的應用

假如我們有個map對象是這么聲明的:

    std::map<
    
      int
    
    , std::
    
      string
    
    > my_map;

my_map.insert(std::make_pair(10, "
    
      china
    
    "));

my_map.insert(std::make_pair(20, "
    
      usa
    
    "));

my_map.insert(std::make_pair(30, "
    
      english
    
    "));

my_map.insert(std::make_pair(40, "
    
      hongkong
    
    "));
  

?

插入值后我們想得到值為”english”的這條記錄,要怎樣寫程序呢?下面是個范例參考下:

1? #include ? < map >
2? #include ? < string >
3? ?
4? class ? map_finder
5? {
6? public :
7? ? ? ? ? ? ? ? map_finder( const ? std : : string ? & cmp_string) : m_s_cmp_string(cmp_string) { }
8? ? ? ? ? ? ? ? bool ? operator ? ()( const ? std : : map < int, ? std : : string > : : value_type ? & pair)
9? ? ? ? ? ? ? ? {
10? ? ? ? ? ? ? ? ? ? ? ? ? return ? pair . second ? = = ? m_s_cmp_string;
11? ? ? ? ? ? ? ? }
12? private :
13? ? ? ? ? ? ? ? ? const ? std : : string ? & m_s_cmp_string; ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
14? } ;
15? ?
16? int ? main()
17? {
18? ? ? ? ? std : : map < int, ? std : : string > ? my_map;
19? ? ? ? ? my_map . insert(std : : make_pair( 10 , ? " china " ));
20? ? ? ? ? my_map . insert(std : : make_pair( 20 , ? " usa " ));
21? ? ? ? ? my_map . insert(std : : make_pair( 30 , ? " english " ));
22? ? ? ? ? my_map . insert(std : : make_pair( 40 , ? " hongkong " )); ? ? ? ?
23? ? ? ? ?
24? ? ? ? ? std : : map < int, ? std : : string > : : iterator ? it ? = ? my_map . end();
25? ? ? ? ? it ? = ? std : : find_if(my_map . begin(), ? my_map . end(), ? map_finder( " english " ));
26? ? ? ? ? if ? (it ? = = ? my_map . end())
27? ? ? ? ? ? ? ? printf( " not ? found\n " ); ? ? ? ? ? ? ?
28? ? ? ? ? else
29? ? ? ? ? ? ? ? printf( " found ? key:%d ? value:%s\n " , ? it - > first, ? it - > second . c_str());
30? ? ? ? ? ? ? ?
31? ? ? ? ? return ? 0 ; ? ? ? ? ? ? ? ?
32? }

class map_finder即用于比較的函數對象,它的核心就是重載的()運算符。 因為每個容器迭代器的*運算符得到的結果都是該容器的value_type值 ,所以該運算符的形參就是map迭代器指向的value_type類型的引用。而map的value_type到底是什么類型,就得看下STL的源代碼是如何定義的。

    
      template
    
     <
    
      class
    
     Key, 
    
      class
    
     T, 
    
      class
    
     Compare = less<Key>, 
    
      class
    
     Alloc = alloc>


    
      class
    
     map

{


    
      public
    
    :


    
      typedef
    
     Key key_type;


    
      typedef
    
     pair<
    
      const
    
     Key, T> value_type;

......

};
  

從上面的定義可以看出,map的value_type是std::pair<const Key, t>類型,它的first值就是關鍵字,second值保存map的值域。

3 -- find_if在std::vector的應用

vector的find_if用法與map的很相似,區別僅僅是二者的value_type不一樣而已。我們看下vecotr對value_type的定義。

    
      template
    
     <
    
      class
    
     T, 
    
      class
    
     Alloc = alloc>


    
      class
    
     vector

{


    
      public
    
    :


    
      typedef
    
     T value_type;


    
      typedef
    
     value_type* iterator;

......

};
  

可以看出vector的value_type就是容器的值類型,了解了這點,我們做個vector的find_if示范。

1? #include ? < vector >
2? #include ? < string >
3? ?
4? struct ? value_t
5? {
6? ??? int ? a;
7? ??? int ? b;
8? } ;
9? ?
10? class ? vector_finder
11? {
12? public :
13? ??? vector_finder( const ? int ? a) : m_i_a(a) { }
14? ??? bool ? operator ? ()( const ? std : : vector < struct ? value_t > : : value_type ? & value)
15? ??? {
16? ??? ??? return ? value . a ? = = ? m_i_a;
17? ??? }
18? private :
19? ??? int ? m_i_a; ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
20? } ;
21? ?
22? ?
23? int ? main()
24? {
25? ? ? ? ? std : : vector < struct ? value_t > ? my_vector;
26? ??? struct ? value_t ? my_value;
27? ???
28? ??? my_value . a ? = ? 11 ; ? my_value . b ? = ? 1000 ;
29? ? ? ? ? my_vector . push_back(my_value);
30? ? ? ? ?
31? ??? my_value . a ? = ? 12 ; ? my_value . b ? = ? 1000 ;
32? ??? my_vector . push_back(my_value);
33? ?
34? ??? my_value . a ? = ? 13 ; ? my_value . b ? = ? 1000 ;
35? ??? my_vector . push_back(my_value);
36? ?
37? ??? my_value . a ? = ? 14 ; ? my_value . b ? = ? 1000 ;
38? ??? my_vector . push_back(my_value);
39? ? ? ? ?
40? ? ? ? ? std : : vector < struct ? value_t > : : iterator ? it ? = ? my_vector . end();
41? ??? it ? = ? std : : find_if(my_vector . begin(), ? my_vector . end(), ? vector_finder( 13 ));
42? ? ? ? ? if ? (it ? = = ? my_vector . end())
43? ?????? printf( " not ? found\n " ); ? ? ? ? ? ? ?
44? ? ? ? ? else
45? ? ? ? ? ? ? printf( " found ? value.a:%d ? value.b:%d\n " , ? it - > a, ? it - > b);
46? ? ? ? ? ? ? ?
47? ? ? ? ? getchar();
48? ??? return ? 0 ; ? ? ? ? ? ? ? ?
49? }

?來自網絡整理。。。find原型和使用方法!

容器find_if函數定義和其第三個參數重載的疑問


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦?。。?/p>

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 中国国产高清一级毛片 | www国产精品com | 高清视频 一区二区三区四区 | 亚洲高清一区二区三区 | 中文字幕在线看视频一区二区三区 | 欧美vs日韩vs国产在线观看 | 黄色毛片小视频 | 中文字幕日韩一区二区三区不 | 四虎免费紧急入口观看 | 国产福利在线观看 | 老妇激情毛片免费 | 国产亚洲综合一区二区在线 | 久久综合香蕉久久久久久久 | 特黄未满14周岁毛片 | 亚洲qingse中文久久网 | 国产精品 视频一区 二区三区 | 日韩精品a| avav国产| 美女操穴视频 | 神马我我不卡伦影视 | 99免费观看 | 黑人巨大精品战中国美女 | 一级啪啪片 | 精品99视频| 色婷婷一区二区三区四区成人 | 天堂精品高清1区2区3区 | 亚洲二区在线视频 | 日日日影院 | 精品久久伦理中文字幕 | 亚洲久热 | 国产欧美一区二区成人影院 | 一区二区三区不卡免费视频97 | 女人18毛片特级一级免费视频 | 九九色播 | 欧美hdvideosex4k | 99在线播放 | 男人的天堂免费视频 | 99热99re8国产在线播放 | 97dyy在线观看手机版 | 久久精品人 | 操天天|