2011-09-07 37 views
4

我有一個地圖容器。如何使用find_if返回大於用戶指定的搜索值的第一個值,如下所示:從地圖容器中查找大於用戶指定值的第一個值

std::map<string, int>::iterator it = find_if(Mymap.begin(), Mymap.end(), ...... 

非常感謝!

+0

(以.pdf文件可用)「標準庫的遊」的std :: find_if絕對需要?如果不是的話,Mark B的答案會更快。 –

回答

3

隨着拉姆達:

int n = MYVALUE; 
auto it = std:: find_if(Mymap.begin(), Mymap.end(), 
         [n](const std::pair<std::string, int> & x) -> bool 
         { return x.second > n; } 
         ); 

(如果該值是固定的也可以把它直接拉姆達體內。)

隨着謂詞:

struct Finder 
{ 
    Finder(int n_) : n(n_) { } 
    int n; 
    bool operator()(const std::pair<std::string, int> & x) const 
    { 
    return x.second > n; 
    } 
}; 

std::find_if(Mymap.begin(), Mymap.end(), Finder(MYVALUE)); 
+0

謝謝你的回答。但我的編譯器不支持lamda函數。 – GoldenLee

+1

你的編譯器多大了?然後使用謂詞。它完全一樣。 –

+1

也許你的意思是operator() –

2

對於C + +03你需要提供比較對象,或者處理一些棘手的綁定:

typedef map<string, int>::value_type Value; 

struct Comp 
{ 
    Comp(int v) : m_v(v) { } 

    bool operator()(const Value& v) const 
    { 
     return v.second > m_v; 
    } 

    int m_v; 
}; 

void f() 
{ 
    map<string, int> Mymap; 
    map<string, int>::iterator it = find_if(Mymap.begin(), Mymap.end(), Comp(42)); 
} 
+0

親愛的Alexander Poluektov 非常感謝!它現在有效。 – GoldenLee

4

您確定要通過容器對任何值大於標準的項目進行線性搜索嗎?

也許會更好地保持排序值的單獨索引,您可以調用upper_bound,以對數時間執行,而不是元素數量的線性。替代地查看boost::multi_index

0

當涉及到STL功能時,您可能會發現B.Stroustrup的書非常有用。 他提出這樣的代碼:

bool gt_42 (const pair <const string ,int>& r) 
{ 
    return r.second >42 ; 
} 
void f (map <string,int >& m) 
{ 
    typedef map <string ,int >:: const_iterator MI ; 
    MI i = find_if (m.begin(), m.end(), gt_42); 
    // ... 
} 

從章"The C++ Programming Language, Special Edition"

相關問題