2024
11.23

std::find

cppreference : std::find
https://en.cppreference.com/w/cpp/algorithm/find

 

<algorithm> 헤더에있는 std::find 의 경우 벡터 등 여러 컨테이너에 사용되기 때문에

시작 이터레이터, 끝 이터레이터, 찾을 value 순으로 인자를 받는다.

 

string은 char 형의 배열이다 라는 전제로 사용되는 거라서 특정 문자의 포함 여부를 찾을 수는 있지만
문자열을 찾지는 못한다.

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

int main() {
    std::string str = "Hello, world!";
    char target = 'o';

    auto it = std::find(str.begin(), str.end(), target);

    if (it != str.end()) {
        std::cout << "'" << target << "'는 문자열의 " << std::distance(str.begin(), it) << "번째 위치에 있습니다." << std::endl;
    } else {
        std::cout << "'" << target << "'를 찾을 수 없습니다." << std::endl;
    }

    return 0;
}

 

 

std::string::find

때문에 string에는 find를 제공한다.

멤버 함수형식으로 호출해야 하며, iterator가 아니라 인덱스를 반환한다는 점이 특징

size_t find (const string& str, size_t pos = 0) const;
size_t find (const char* s, size_t pos = 0) const;
size_t find (const char* s, size_t pos, size_t n) const;
size_t find (char c, size_t pos = 0) const;

 

첫 번째 인자로 찾을 문자열 혹은 char 형 문자를 받으며, 

두번 째 인자로 찾을 시작 위치를 지정한다. 

세 번째 인자는 검색할 부분 문자열의 길이이다.

 

반환값은 문자 위치인데 int가 아니라 size_t 이며, 찾지 못할 경우  std::string::npos 를 반환 한다.

#include <iostream>
#include <string>

int main() {
    std::string str = "Hello, world!";
    std::string target = "world";

    // std::string::find를 사용하여 부분 문자열 검색
    size_t pos = str.find(target);

    if (pos != std::string::npos) {
        std::cout << "'" << target << "'는 문자열의 " << pos << "번째 위치에서 시작합니다." << std::endl;
    } else {
        std::cout << "'" << target << "'를 찾을 수 없습니다." << std::endl;
    }

    return 0;
}

 

std::string::rfind

std::string::find 의 뒤에서 부터 찾는 버전이다.

단, 앞에서부터의 시작 인덱스를 반환한다.

주어진 부분 문자열이 검색 문자열에서 단 한개만 존재한다면 결과값이 같다!

 

myString의 부분문자열중 pat이 포함된 가장 긴 문자열을 반환하는 예제

string solution(string myString, string pat) {
    size_t pos = myString.rfind(pat);
    return string(myString.begin(), myString.begin() + pos + pat.size());
}

 

COMMENT