STL 알고리즘 개요 & find

Jaemyeong Lee·2024년 12월 6일

게임 서버1

목록 보기
95/220

#include <algorithm>이 필요한 이유

직접 순회의 한계

  • 특정 값을 찾는 코드를 매번 직접 작성하면, 로직은 단순해도 코드가 길어집니다.
  • "순회 -> 비교 -> break" 패턴이 반복되어 의도(검색)보다 구현 디테일이 눈에 띕니다.
std::vector<int> v{10, 20, 30, 40, 50};
int number = 50;

auto it = v.begin();
bool found = false;
while (it != v.end()) {
    if (*it == number) {
        found = true;
        break;
    }
    ++it;
}

std::find로 의도 표현

#include <algorithm>

auto it = std::find(v.begin(), v.end(), number);
if (it != v.end()) {
    // 찾음
} else {
    // 못 찾음
}
  • std::find는 "찾기" 의도를 함수 이름으로 직접 표현합니다.
  • 성능은 직접 순회와 본질적으로 동일(선형 탐색, O(N))합니다.

find의 정확한 반환 규칙

  • 찾으면: 첫 번째 일치 원소를 가리키는 이터레이터 반환
  • 못 찾으면: end() 반환
  • 빈 컨테이너면 begin() == end()이므로 바로 "못 찾음"
std::vector<int> v{3, 7, 7, 9};
auto it = std::find(v.begin(), v.end(), 7); // 첫 번째 7 위치

컨테이너가 바뀌어도 같은 인터페이스

  • vector, list, deque 등 대부분 컨테이너에서 같은 형태로 사용합니다.
  • "알고리즘 + 이터레이터" 조합이 STL의 핵심 설계 철학입니다.

네임스페이스 (namespace)와 std::

std::의 의미

  • std::는 C++ 표준 라이브러리 네임스페이스입니다.
  • std::find는 "표준 라이브러리의 find"라는 뜻입니다.

왜 네임스페이스가 필요한가?

  • 같은 이름의 함수/타입 충돌을 방지하기 위해서입니다.
  • 예를 들어 프로젝트에 find라는 사용자 함수가 있어도 std::find와 구분 가능합니다.

using namespace std; 사용 원칙

  • 학습/짧은 예제에서는 편할 수 있지만, 실제 코드베이스에서는 충돌 가능성이 커집니다.
  • 실무에서는 보통 std::를 명시하거나, 필요한 이름만 좁은 범위에서 using 합니다.
using std::cout;
using std::vector;

실전 팁

  • 자주 쓰는 STL 알고리즘(find_if, count_if, for_each, remove_if)부터 익히면 충분합니다.
  • 생소한 알고리즘을 쓸 때는 "왜 이 알고리즘을 선택했는지"를 짧게 주석으로 남기면 협업에 유리합니다.

profile
李家네_공부방

0개의 댓글