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