이글은 예전 제 싸이월드 블로그에 작성한 글을 티스토리로 옮긴 것입니다.
원문 : http://cy.cyworld.com/home/21147242/post/5500EDA6EA95739A07C68401
원문 작성일 : 2015.3.12

============================================================

 

list 컨테이너에서 조건에 맞는 값을 찾고자 할 때 find_if() 함수를 쓴다.
조건값이 특정값이라면 함수객체(펑크터)를 사용해 쉽게 구현이 되지만
조건값을 변수 형태로 취하려면 어댑터 개념을 적용해야 한다.

C++ 기초 플러스, C++ Standard Library 책을 눈알 빠지게 봐도 뭔소린지 모르겠다.
결국 SOEN(http://www.soen.kr) 에서 도움을 받았다.
(SOEN ->C/C++ 강좌 ->4부.C++고급 ->38장 함수객체 ->바인더)
한국인이 쓴 책이 문장도 좋고 이해가 잘 될 때가 분명히 있다.

아래 코드는 보관용 수준으로 작성한 예제이다.
- list 에 4개의 값을 저장하였다.
- 이 중 나는 number 값이 1003인 이터레이터를 가져오고 싶다.
- 1003이 아닌 다른 값을 가져오고 싶다면, filter 변수값을 변경하면 된다.

아래 예제는 number가 1003인 구조체값을 가져와 그 구조체의 major 값을 찍었다.
원하는대로 값을 가져오고 있다.

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
#include <cstdio>
#include <list>
#include <algorithm>
#include <functional>
 
using namespace std ;
 
 
struct Program
{
        int major ;
        int number ;
        int pid ;
} ;
 
class FindProgram : public binary_function<Program, int , bool >
{
public :
        bool operator() ( const Program& p, int b) const
        {
                return (p.number == b) ;
        }
} ;
 
int main()
{
        list<Program> listProgram ;
        list<Program> ::iterator listProgramIter ;
 
        Program program ;
 
        program.major = 7 ;
        program.number = 1001 ;
        program.pid = 0x20 ;
        listProgram.push_back(program) ;
 
        program.major = 7 ;
        program.number = 1002 ;
        program.pid = 0x21 ;
        listProgram.push_back(program) ;
 
        program.major = 9 ;
        program.number = 1003 ;
        program.pid = 0x22 ;
        listProgram.push_back(program) ;
 
        program.major = 11 ;
        program.number = 1004 ;
        program.pid = 0x23 ;
        listProgram.push_back(program) ;
 
        int filter = 1003 ;
 
        listProgramIter = find_if(listProgram.begin(), listProgram.end(), bind2nd(FindProgram(), filter)) ;
 
        if(listProgramIter != listProgram.end())
        {
                printf("val : %d\n", listProgramIter->major) ;
        }
 
        return 1;
}
 


 

+ Recent posts