find에 대한 질문을 하셔서 간단한 예제를 하나 보도록 하겠습니다.
find와 find_if의 탐색 속도는 선형시간 입니다.
만일자료가 정렬되어 있다면 binary_search(탐색 속도는 로그타임)를
사용하는것이 훨씬 좋습니다.
우선 아래 코드 내용 잠깐 훑어 보세요.
문자열을 입력 받고 space 를 찾아 문자열을 단어로 잘라서 vector<string>에
넣는 것입니다.
실행하고 insert string : 에 aaa bbb ccc ddd 이렇게 넣으면
aaa
bbb
ccc
ddd 이런식으로 출력됩니다.
자세한 설명은 아래쪽에서...
1 #include <iostream> 2 #include <iterator> 3 #include <string> 4 #include <vector> 5 #include <algorithm> //find_if 6 #include <cctype> //isspace 7 8 using namespace std; 9 10 bool notspc(char c) { return !isspace(c); } 11 bool spc(char c) { return isspace(c); } 12 13 int main() 14 { 15 typedef string::iterator iter; 16 17 string str; 18 vector<string> vs; 19 20 cout << "Insert string : "; 21 getline(cin,str); 22 23 iter i=str.begin(); 24 25 while(i!=str.end()) 26 { 27 i=find_if(i,str.end(),notspc); 28 iter j=find_if(i,str.end(),spc); 29 if(i!=str.end()) 30 vs.push_back(string(i,j)); 31 i=j; 32 } 33 34 endl(cout); 35 cout << "The string split by whitespace." << endl; 36 copy(vs.begin(),vs.end(),ostream_iterator<string>(cout,"\n")); 37 38 return EXIT_SUCCESS; 39 } 40 |
10,11번은 find_if에서 사용할 조건용 함수 입니다.
find와 find_if의 차이는 find는 값으로 찾고 find_if는 함수로 찾습니다.
27,28번을 보면 find_if가 함수를 쓸 때 notspc, spc로 사용하는데
이는 함수 포인터로 받는다는 것을 알 수 있습니다.
find와 find_if 는 배열에서도 그대로 사용할 수 있습니다.
int a[100] 이라는 정수 배열이 있으면 같은 타입의
int* pi 를 만들어 주고
pi = find(a, a+100, 5) 이렇게 사용할 수 있습니다.
위 내용에서 i와 j 는 string::iterator 입니다.
27번은 처음 공백이 있는 것을 무시하고 문자를 찾으면 위치를 i에 저장하고
28번은 i 다음에 공백을 찾고 없으면 str.end()를 return 합니다.
그리고 vetor<string> 컨테이너에 string을 i,j 범위로 저장을 하고
i는 j의 위치 값을 받고 i==str.end()가 될 때 까지 반복을 합니다.
str.begin() str.end()
↓ ↓
aaa□bbb□ccc□ddd
↑ ↑
i j
위 와 같이 j가 빈공백을 지정하고 있다고 해서 vector<string>에 aaa□ (← 공백)
이렇게 4자가 들어가지는 않습니다.
string(i,j) 라는 것도 j가 하나 지난 위치 이므로 aaa 세자만 들어가게 됩니다.
대부분의 generic algorithm은 iterator를 인자로 받습니다. 그도 그런것이 컨테이너 타입은
정해져 있기 않기 때문에 값에 의한 활용은 상당히 힘들 수 밖에 없습니다.
find와 find_if는 iterator를 return 합니다. 만일 찾는 것이 없을 경우는 컨테이너의 c.end()를
return 합니다. 그러므로
if( (container::iterator itr = find(c.begin(),a.c.end(),'a'))==c.end() )
와 같은 식으로 하여 찾고자 하는 것이 있는지 없는지를 알 수 있습니다.
'C C++ - STL' 카테고리의 다른 글
STL - 11 Function Object (함수 - 객체) (0) | 2014.02.13 |
---|---|
STL - 10 Vector Container 구현 (0) | 2014.02.13 |
STL - 8 Vector 라이브러리 (0) | 2014.02.13 |
STL - 7 Sequence Container (0) | 2014.02.13 |
STL - 6 알고리즘 (0) | 2014.02.13 |