💡 퀵 접속: cpp.kr/search

search

C++ 표준 라이브러리의 알고리즘으로, 주어진 범위에서 특정 패턴이 처음으로 나타나는 위치를 찾습니다. search는 원본 범위를 수정하지 않고, 패턴이 발견되면 해당 위치의 반복자를 반환하고, 발견되지 않으면 last 반복자를 반환합니다.

기본 사용법

#include <iostream>
#include <vector>
#include <algorithm>

int main() {
    std::vector<int> numbers = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
    std::vector<int> pattern = {4, 5, 6};
    
    std::cout << "원본 벡터: ";
    for (int n : numbers) std::cout << n << " ";
    std::cout << std::endl;
    
    std::cout << "찾을 패턴: ";
    for (int n : pattern) std::cout << n << " ";
    std::cout << std::endl;
    
    // 패턴 찾기
    auto it = std::search(numbers.begin(), numbers.end(),
                         pattern.begin(), pattern.end());
    
    if (it != numbers.end()) {
        std::cout << "패턴이 발견된 위치: ";
        for (auto i = it; i != it + pattern.size(); ++i) {
            std::cout << *i << " ";
        }
        std::cout << std::endl;
    } else {
        std::cout << "패턴을 찾을 수 없습니다." << std::endl;
    }
    
    return 0;
}

실행 결과:

원본 벡터: 1 2 3 4 5 6 7 8 9 10
찾을 패턴: 4 5 6
패턴이 발견된 위치: 4 5 6

문자열에서 사용

#include <iostream>
#include <string>
#include <algorithm>

int main() {
    std::string text = "Hello, World!";
    std::string pattern = "World";
    
    std::cout << "원본 문자열: " << text << std::endl;
    std::cout << "찾을 패턴: " << pattern << std::endl;
    
    // 패턴 찾기
    auto it = std::search(text.begin(), text.end(),
                         pattern.begin(), pattern.end());
    
    if (it != text.end()) {
        std::cout << "패턴이 발견된 위치: ";
        for (auto i = it; i != it + pattern.size(); ++i) {
            std::cout << *i;
        }
        std::cout << std::endl;
    } else {
        std::cout << "패턴을 찾을 수 없습니다." << std::endl;
    }
    
    return 0;
}

실행 결과:

원본 문자열: Hello, World!
찾을 패턴: World
패턴이 발견된 위치: World

사용자 정의 타입에서 사용

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

class Person {
    std::string name;
    int age;
public:
    Person(const std::string& n, int a) : name(n), age(a) {}
    
    bool operator==(const Person& other) const {
        return name == other.name && age == other.age;
    }
    
    void print() const {
        std::cout << name << " (" << age << "세)" << std::endl;
    }
};

int main() {
    std::vector<Person> people = {
        Person("Alice", 20),
        Person("Bob", 30),
        Person("Charlie", 25),
        Person("David", 35),
        Person("Eve", 22)
    };
    
    std::vector<Person> pattern = {
        Person("Charlie", 25),
        Person("David", 35)
    };
    
    std::cout << "원본 목록:" << std::endl;
    for (const auto& person : people) {
        person.print();
    }
    
    std::cout << "\n찾을 패턴:" << std::endl;
    for (const auto& person : pattern) {
        person.print();
    }
    
    // 패턴 찾기
    auto it = std::search(people.begin(), people.end(),
                         pattern.begin(), pattern.end());
    
    if (it != people.end()) {
        std::cout << "\n패턴이 발견된 위치:" << std::endl;
        for (auto i = it; i != it + pattern.size(); ++i) {
            i->print();
        }
    } else {
        std::cout << "\n패턴을 찾을 수 없습니다." << std::endl;
    }
    
    return 0;
}

실행 결과:

원본 목록:
Alice (20세)
Bob (30세)
Charlie (25세)
David (35세)
Eve (22세)

찾을 패턴:
Charlie (25세)
David (35세)

패턴이 발견된 위치:
Charlie (25세)
David (35세)

참고사항

  • search는 algorithm 헤더에 정의되어 있습니다.
  • 원본 범위를 수정하지 않습니다.
  • 시간 복잡도는 O(n*m)입니다. 여기서 n은 원본 범위의 크기이고 m은 패턴의 크기입니다.
  • 패턴이 발견되면 해당 위치의 반복자를 반환하고, 발견되지 않으면 last 반복자를 반환합니다.
  • 사용자 정의 타입을 사용할 때는 operator==가 정의되어 있어야 합니다.
  • search_n은 연속된 n개의 동일한 값을 찾는 버전입니다.
  • find_end는 패턴이 마지막으로 나타나는 위치를 찾는 버전입니다.
함수 설명
search(first1, last1, first2, last2) 범위 [first1, last1)에서 [first2, last2) 패턴이 처음으로 나타나는 위치를 찾음