#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);
컨테이너가 바뀌어도 같은 인터페이스
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)부터 익히면 충분합니다.
- 생소한 알고리즘을 쓸 때는 "왜 이 알고리즘을 선택했는지"를 짧게 주석으로 남기면 협업에 유리합니다.