본문 바로가기
C,C++/C++

[C++ STL] <algorithm> std::search() 함수

by woohyeon 2019. 11. 7.
반응형

안녕하세요.
오늘은 <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 함수는 아래와 같이 동작합니다.

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번째 인덱스를 가리키는 반복자를 반환합니다.

 

참고)
http://www.cplusplus.com/reference/algorithm/search/




댓글