모두의 코드
C++ 레퍼런스 - search 함수 (<algorithm>)

작성일 : 2019-02-18

아직 C++ 에 친숙하지 않다면 씹어먹는 C++ 은 어때요?

search

<algorithm> 에 정의됨

// == 를 이용한 비교
template <class ForwardIterator1, class ForwardIterator2>
ForwardIterator1 search(ForwardIterator1 first1, ForwardIterator1 last1,
                        ForwardIterator2 first2, ForwardIterator2 last2);

// ForwardIterator1 와 ForwardIterator2 의 원소를 받는 함수 pred 를 이용한 비교
template <class ForwardIterator1, class ForwardIterator2, class BinaryPredicate>
ForwardIterator1 search(ForwardIterator1 first1, ForwardIterator1 last1,
                        ForwardIterator2 first2, ForwardIterator2 last2,
                        BinaryPredicate pred);

부분 원소열을 검색한다.

범위 (first1 부터 last1 전 까지) 내에 원소들 중에서 원소열 [first, last2) 가 처음으로 등장하는 위치를 찾고, 해당 위치의 시작점을 가리키는 반복자를 리턴합니다. 만일, 원소열이 등장하지 않는다면 last1 을 리턴합니다.

만일 두 원소를 비교하는 방법을 명시하지 않는다면 operator== 을 통해 원소를 비교하게 됩니다. search 의 5번째 인자로 두 원소를 비교해서 그 결과를 리턴하는 함수를 전달한다면 이를 사용하게 됩니다.

이 함수는 원소열 [first, last2)처음 으로 등장하는 위치를 찾습니다. 만일, 마지막으로 등장하고 있는 위치를 찾고 싶다면 find_end 함수를 사용하면 됩니다.

인자들

리턴값

첫 번째로 [first2, last2)[first1, last1) 에서 등장하는 위치를 가리키는 반복자를 리턴한다. 만일 해당 원소열이 없다면 last1 이 리턴된다. 만일 [first2, last2) 가 빈 원소열이라면 first1 이 리턴된다.

구현 예시

template <class ForwardIterator1, class ForwardIterator2>
ForwardIterator1 search(ForwardIterator1 first1, ForwardIterator1 last1,
                        ForwardIterator2 first2, ForwardIterator2 last2) {
  if (first2 == last2) return first1;  // specified in C++11

  while (first1 != last1) {
    ForwardIterator1 it1 = first1;
    ForwardIterator2 it2 = first2;
    // pred 를 사용하는 경우 while (pred(*it1,*it2)) 가 된다.
    while (*it1 == *it2) {
      if (it2 == last2) return first1;
      if (it1 == last1) return last1;
      ++it1;
      ++it2;
    }
    ++first1;
  }
  return last1;
}

실행 예제

#include <algorithm>
#include <functional>
#include <iostream>
#include <string>
#include <vector>

template <typename Container>
bool in_quote(const Container& cont, const std::string& s) {
  return std::search(cont.begin(), cont.end(), s.begin(), s.end()) !=
         cont.end();
}

int main() {
  std::string str = "why waste time learning, when ignorance is instantaneous?";
  // str.find() can be used as well
  std::cout << std::boolalpha << in_quote(str, "learning") << '\n'
            << in_quote(str, "lemming") << '\n';

  std::vector<char> vec(str.begin(), str.end());
  std::cout << std::boolalpha << in_quote(vec, "learning") << '\n'
            << in_quote(vec, "lemming") << '\n';

  // The C++17 overload demo:
  std::string in =
    "Lorem ipsum dolor sit amet, consectetur adipiscing elit,"
    " sed do eiusmod tempor incididunt ut labore et dolore magna aliqua";
  std::string needle = "pisci";
  auto it =
    std::search(in.begin(), in.end(),
                std::boyer_moore_searcher(needle.begin(), needle.end()));
  if (it != in.end())
    std::cout << "The string " << needle << " found at offset "
              << it - in.begin() << '\n';
  else
    std::cout << "The string " << needle << " not found\n";
}

실행 결과

실행 결과

true
false
true
false
The string pisci found at offset 43

참고 자료

첫 댓글을 달아주세요!
프로필 사진 없음
강좌에 관련 없이 궁금한 내용은 여기를 사용해주세요