const_iterator는 컨테이너 내의 값에 대한 "포인터와 같은" 핸들을 제공합니다. 일반 iterator와 다른 점은 const 형태로 변경 없이 참조만 하는 경우 사용합니다. 여기서 예제로 설명드릴 컨테이너 클래스는 동적 배열인 std::vector입니다. 한글로는 "이터레이터", "콘스트 이터레이터"라고 부릅니다.
const_iterator의 동작 방식
vector 인스턴스는 const_iterator를 요청 시 내부 데이터에 바인딩된 const 반복자를 생성합니다. 그 후에는 컨테이너의 인덱스 위치인 것처럼 작동합니다. 오직 컨테이너가 임의 액세스를 지원하는 경우만 지원되며, array 및 vector do, list 및 map 은 지원하지 않습니다. 참조하는 위치를 변경하기 위해서는 인덱스 값을 더하거나 빼거나 증가(++) 또는 감소(--) 연산자를 사용하여 벡터 반복자를 증가 및 감소시켜서 컨테이너 내 참조하는 위치를 변경할 수 있습니다.
반복자는 동일한 컨테이너의 다른 반복자와 비교 연산이 가능하고 bool 비교를 반환할 수 있습니다. 일반 iteratord에 비해 const iterator는 할당이나 값 교환을 통해 반복자를 통해 벡터의 값을 변경할 수 없습니다. 그래서 변경 없이 참조만 할 경우에는 안전하게 const 버전을 사용하는 것을 권장드립니다.
iterator와 const_iterator를 생성하는 방법
반복자를 얻기 위한 네 가지 주요 사용자 함수는 vector::cbegin(), vector::cend(), vector::begin() 및 vector::end() 입니다. 컨테이너 상 첫 번째 항목에 대한 반복자에 대한 const(cbegin()) 또는 비 const 참조(begin()를 반환하고 마지막 항목을 전달한 위치(cend() 또는 end())를 각각 반환합니다.
- std::vector::begin() // non-const iterators
- std::vector::end() // 마지막 항목의 다음 위치
- std::vector::cbegin() // const iterators
- std::vector::cend() // 마지막 항목의 다음 위치 (읽기 전용 버전)
이터레이터를 사용할 때 주의해야 할 사항
다시 설명하면 vector.begin() 은 처음 위치를 반환하고 vector.end()는 벡터에서 마지막 위치 +1을 반환합니다. 사용 중 벡터에 항목이 추가되거나 삭제되어 크기가 변경되면 반복자가 무효화될 수 있습니다. 무효화라는 말은 iterator가 의도치 않은 배열의 다른 값을 가리키거나 vector range를 넘어선 잘못된 위치를 가리킨다는 뜻입니다. 이때는 iterator(const_iterator)를 다시 받아오거나, 삭제 함수의 리턴 값으로 재설정하는 등의 처리가 필요합니다. 예를 들어 vector.push_back()를 호출할 경우 미리 선언한 end iterator의 값을 다시 참조하면 위험하다는 뜻입니다.
const_iterator를 사용한 예제 코드
std::vector<int> v{ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; // 10개 항목의 vector를 선언
auto it = v.cbegin(); // const_iterator 로 시작항목을 구함
// 각 항목을 접근하는 방법
std:cout << "the first item: " << *it << "\n";
std:cout << "the second item: " << *(it+1) << "\n";
std:cout << "the third item: " << *(it+2) << "\n";
std:cout << "the fourth item: " << *(it+3) << "\n";
std:cout << "the last item: " << *(v.cend() - 1) << "\n";
// vector에서 특정 항목을 검색하고 iterator를 받아오는 코드
int x = 7;
it = std::find( v.begin(), v.end(), x);
// 검색에 성공했는지 검사하는 방법, end() 와 동일한 경우 참지 못한 경우이다.
if (it != v.end()
std::cout << "found " << x << in "vector\n";
else
std::cout << x << "not found in vector\n";
'개발일기 > 설계와디자인' 카테고리의 다른 글
std::vector 와 std::array 중 어떤 것을 사용할지의 선택 기준 (0) | 2021.11.06 |
---|---|
데이터 중심 프로그래밍 (0) | 2008.09.29 |
매커니즘과 정책을 분리하라 (4) | 2008.09.01 |
댓글