안녕하세요.
오늘은 <algorithm> 헤더의 std::search() 함수에 대해 알아보겠습니다.
template <class ForwardIterator1, class ForwardIterator2>
ForwardIterator1 search (ForwardIterator1 first1, ForwardIterator1 last1,
ForwardIterator2 first2, ForwardIterator2 last2);
search 함수는 [first1, last1) 범위의 요소들 중 [first2, last2) 범위의 요소들과 순차적으로 모두 일치하는 요소들을 찾아
해당 요소의 시작 지점을 가리키는 반복자를 반환합니다.
예를 들어 "hello world"에서 "world" 를 포함하는 첫 위치를 알고 싶을 때 사용할 수 있습니다. "world"가 존재한다면 첫 문자인 'w'를 가리키는 반복자를 반환합니다.
first1, last1
요소를 찾기위해 탐색할 대상을 나타내는 범위이며 반복자입니다. [first1, last1) 범위의 컨테이너에서 요소를 탐색합니다.
first2, last2
찾기를 원하는 대상(target)을 나타내는 범위이며 반복자입니다.
[first2, last2) 범위의 모든 요소와 순차적으로 일치하는 요소를 찾습니다.
반환 값
[first1, last1) 범위의 컨테이너에서 [first2, last2) 와 일치하는 첫 요소의 반복자를 반환합니다.
만약 찾지 못했다면 last1을 반환합니다.
search 함수는 아래와 같이 동작합니다.
-> 찾으려는 대상의 range가 올바르지 않을 경우 first1을 반환합니다. // Line 5
-> 탐색 대상인 컨테이너에서 일치하는 대상을 찾았지만 범위가 유효하지 않을 경우 last1을 반환합니다. // Line 13
-> 찾지 못했을 경우도 last1을 반환합니다. // Line 18
예제)
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
using std::string;
using std::vector;
using std::cout;
int main(void)
{
/*
벡터 탐색
*/
// A step you can't take back
vector<string> myvector {"A", "step", "you", "can't", "take", "back" };
// can't take !
vector<string> target {"can't", "take", "!"};
/*
벡터에서 벡터를 탐색합니다.
target 벡터의 [begin, end-1) 범위의 요소
즉 "can't", "take" 두 요소가 연속으로 존재한다면
'c'를 가리키는 반복자를 반환합니다.
*/
vector<string>::const_iterator it;
it = std::search(myvector.begin(), myvector.end(), target.begin(), target.end()-1);
// 3
cout << "#1 벡터 탐색"<< "\n";
cout << "Output: " << it-myvector.begin() << "\n\n";
/*
문자열에서 문자열을 탐색합니다.
target_2의 [begin, end) 범위의 문자열
즉 "woohyeon" 문자열이 mystring에 존재한다면
'w'를 가리키는 반복자를 반환합니다.
*/
string mystring = "My name is woohyeon!";
string target_2 = "woohyeon";
string::const_iterator it_2;
it_2 = std::search(mystring.begin(), mystring.end(), target_2.begin(), target_2.end());
// 11
cout << "#2 문자열 탐색" << "\n";
cout << "Output: " << it_2-mystring.begin() << "\n";
return 0;
}
결과)
설명)
#1 벡터 탐색에선
A / step / you / can't / take / back 을 요소로 가지는 myvector에서
can't / take / ! 를 요소로 갖는 target 벡터의 [target.begin(), target.end()-1) 범위의 요소를 탐색합니다.
즉 마지막 요소를 제외한 can't / take 두 개의 요소를 찾습니다.
이 때 "can't" 요소가 처음 등장하는 3번째 인덱스의 반복자를 반환합니다.
#2 문자열 탐색에선
"My name is woohyeon!" 값을 갖는 mystring에서
"woohyeon" 값을 갖는 target_2를 탐색합니다.
target_2가 처음 등장하는 11번째 인덱스를 가리키는 반복자를 반환합니다.
'C,C++ > C++' 카테고리의 다른 글
[C++ STL] 라이브러리 알고리즘의 반복자 인자가 마지막 요소의 다음을 참조하는 이유 (0) | 2019.11.25 |
---|---|
[C++ STL] <algorithm> std::remove_if 함수 (0) | 2019.11.08 |
[C++ STL] 특정 값 제외 컨테이너 복사 std::remove_copy() 함수 (0) | 2019.11.06 |
[C++] std::transform() 함수 및 back_inserter 함수에 대해 알아보자 (0) | 2019.11.04 |
[C++] std::equal 함수로 간단하게 회문 판별 함수 구현해보기 / palindrome (0) | 2019.11.02 |
댓글