leetcode에서 cpp 사용 기초 - vector에서 값 찾기
1 min#ps#leetcode#cpp
std::vector에서 특정 값이 포함되어 있는지 확인하는 방법을 빠르게 알아보자.
std::find사용 (가장 일반적인 방법)
<algorithm> 헤더에 포함된 std::find를 사용하는 것이 가장 표준적인 방식. 처음부터 끝까지 하나씩 찾는 방식(선형 탐색).
#include <vector>
#include <algorithm> // find를 위해 필요
#include <iostream>
int main() {
std::vector<int> v = {10, 20, 30, 40, 50};
int target = 30;
// v.begin()부터 v.end()까지 target이 있는지 찾음
auto it = std::find(v.begin(), v.end(), target);
if (it != v.end()) {
std::cout << "값을 찾았습니다!" << std::endl;
} else {
std::cout << "값이 없습니다." << std::endl;
}
}
- std::binary_search 사용 (정렬된 경우) 만약 벡터가 이미 오름차순으로 정렬되어 있다면, binary_search를 쓰는 것이 훨씬 빠르다. (이진 탐색 활용)
#include <vector>
#include <algorithm>
#include <iostream>
int main() {
std::vector<int> v = {10, 20, 30, 40, 50}; // 정렬된 상태
if (std::binary_search(v.begin(), v.end(), 30)) {
std::cout << "값이 존재합니다." << std::endl;
}
}
- std::count 사용 (단순 존재 여부만) count 함수는 해당 값의 개수를 반환.
0보다 크면 존재하는 것으로 간주하는데 그냥 find 써라.
if (std::count(v.begin(), v.end(), target) > 0) {
// 존재함
}
v.begin()과 v.end()의 의미
C++의 <algorithm> 함수들은 대부분 탐색 범위를 지정하기 위해 시작점과 끝점을 인자로 받는다. 이때 범위는 반개구간(Half-open interval) [begin, end) 형태임.
v.begin(): 벡터의 첫 번째 원소를 가리키는 반복자(iterator).v.end(): 벡터의 마지막 원소가 아니라, 마지막 원소의 다음(past-the-end) 공간을 가리키는 반복자.
그니까 0..n쯤으로 생각하면 된단 얘기.
따라서 std::find 같은 함수는 v.end()에 도달할 때까지 탐색을 진행하며, 값을 찾지 못하면 v.end()를 그대로 반환한다. 우리가 값을 찾았는지 확인할 때 if (it != v.end())를 사용하는 이유가 바로 이거때문..