2011-09-07 2 views
4

지도 컨테이너가 있습니다. find_if를 사용하여 사용자 지정 검색 값보다 큰 첫 번째 값을 반환하는 방법은 다음과 같습니다.지도 컨테이너에서 사용자 지정 값보다 큰 첫 번째 값을 찾습니다.

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

대단히 고마워요! 람다로

+0

의 (.pdf 파일에서 사용 가능) "표준 라이브러리의 투어는"표준인가 : 절대적으로 필요 find_if를? 그렇지 않다면 마크 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

B.Stroustrup 책은 STL 기능과 관련하여 매우 유용 할 수 있습니다. 그리고 그는이 코드 제안 : 장에서

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"

관련 문제