본문 바로가기
개발일기/설계와디자인

std::vector<T>::const_iterator 사용방법 설명

by Daniel_Kevin 2021. 11. 6.
반응형

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";

 

 

 

2021년 C++은 여전히 배워야 하는 언어인가? 정답은 예!

여전히 C++는 TIOBE 지수에 따르면 세계에서 4번째로 인기 있는 언어입니다. 고성능 소프트웨어가 필요한 다양한 분야에서 사용됩니다. 예를 들어 Adobe 제품, Unreal Engine, Chrome 및 Firefox와 같은 브라

99bugs.tistory.com

 

 

 

아이폰 비행기모드로 빠르게 급속 충전하자

아이폰 사용하시는 분들 중 대부분이 모르는 꿀팁입니다. 외출 전 핸드폰을 보니 배터리가 몇 프로 남지 않은 상황입니다. 빨리 충전기를 연결하지만 오래 기다릴 여유가 없습니다. 이럴 때는

99bugs.tistory.com

 

반응형
그리드형

댓글