std::find
함수를 사용하면 iterator가 반환되는데요, iterator끼리 빼면 distance(거리)가 나오는 점을 이용하면 찾고자 하는 값이 몇번째 인덱스에 존재하는지 알 수 있습니다.
vector<int> a = { 1,2,3,4 };
cout << std::find(a.begin(), a.end(), 1) - a.begin() << '\n'; // 0
cout << std::find(a.begin(), a.end(), 2) - a.begin() << '\n'; // 1
cout << std::find(a.begin(), a.end(), 3) - a.begin() << '\n'; // 2
cout << std::find(a.begin(), a.end(), 4) - a.begin() << '\n'; // 3
cout << std::find(a.begin(), a.end(), 9999) - a.begin() << '\n'; // 4 == a.size() (=not found)
cout << std::distance(a.begin(), find(a.begin(), a.end(), 555)) << '\n'; // 위와 동일
return 0;
find로 나온 결과에 begin iterator를 빼면 인덱스를 구할 수 있습니다.
존재하지 않는 값의 경우 a.end() - a.begin()이 되기 때문에 vector 사이즈랑 같은 값이 반환됩니다. a.size()를 인덱스로 접근하면 memory access violation이 발생하겠죠? 이 점을 주의해야 합니다.
vector<int> a = { 1,2,3 }, b = { 4,5,6 };
cout << a.begin() - b.end() << '\n'; //Runtime Error: vector iterators incompatible
iterator끼리 빼기 연산을 할 때는 같은 컨테이너가 아닌 iterator끼리 빼기 연산을 하지 않도록 주의하세요. 종료체크를 못하기 때문에 컴파일은 되지만 런타임 에러가 발생합니다.
std::distance
함수의 원리도 동일합니다. begin iterator 부터 얼마나 떨어져있는지를 계산해주는 함수인데요, 사용법은 동일합니다.
반응형
'프로그래밍 > C++' 카테고리의 다른 글
C++ const, constexpr 키워드 차이점 (0) | 2020.05.06 |
---|---|
C++ lower_bound, upper_bound 사용법 (0) | 2020.05.01 |
C++ string substr 메소드 (5) | 2020.04.26 |
C++ 구글식 명명법(naming convention) (0) | 2020.04.21 |
C++ std::pair 정렬방법 (0) | 2020.04.15 |