[STL] map按value值查找——find_if的使用


    最近是經常使用stl中的map,於是就想記一些關於map的東西。這一篇中會講到map按照value值查找的方法,就是find_if函數。

大家都知道在map中,排序是按照key值排的,map自帶的find方法也是按着key值查找的,這在某些情況下可能會遇到一些麻煩。

譬如,map<int, char*> m_str中,傳入一個char*需要查找在m_str中是否存在這個字符串,當然你大可以使用iterator遍歷一些map,

如果你堅持這么做,那就可以直接關閉網頁了。

    1.先來看看find_if的原型:

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()為真。至此可能還有些不是很明了,下面舉幾個例子實際操練下的它的用法。注意觀察第三個參數pred。

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

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

std::map< int, std:: string> mymap;
mymap.insert(std::make_pair( 20" USA "));
mymap.insert(std::make_pair( 10" CHINA ")); 
mymap.insert(std::make_pair( 30" English "));
mymap.insert(std::make_pair( 40" Hongkong "));
插入值后我們想得到值為”english”的這條記錄,要怎樣寫程序呢?下面是個范例參考下:

 #include <map>

#include < string>
#include <algorithm>
class map_value_finder
{
public:
       map_value_finder( const std:: string &cmp_string):m_s_cmp_string(cmp_string){}
        bool  operator ()( const std::map< int, std:: string>::value_type &pair)
       {
             return pair.second == m_s_cmp_string;
       }
private:
         const std:: string &m_s_cmp_string;                    
};
 
int main()
{
    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 "));    
    
    std::map< int, std:: string>::iterator it = my_map.end();
    it = std::find_if(my_map.begin(), my_map.end(), map_value_finder( " English "));
     if (it == my_map.end())
       printf( " not found\n ");       
     else
       printf( " found key:%d value:%s\n ", it->first, it->second.c_str());
       
     return  0;        
}

 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在vector中的應用與上面的類似,就不舉例子了。 區別就是vecotor的value_type和map的value_type不一樣,想大家應該是明白的。

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM