17.1 반복자
컨테이너마다 원소에 대한 반복문을 지원하는 특수한 스마트 포인터인 반복자가 정의되어 있음
반복자는 컨테이너의 특정 원소를 가리키는 포인터
++연산자를 이용해 다음 원소를 가리키도록 변경 가능
반복자는 반드시 복제 생성자, 복제 대입 연산자, 소멸자를 제공해야 함
반복자의 좌측값은 반드시 맞바꾸기를 지원해야 함
반복자는 여섯가지로 분류 가능함
연속 반복자는 모두 임의 접근 반복자
임의 접근 반복자는 모두 양방향 반복자
양방향 반복자는 모두 정방향 반복자
정방향 반복자는 모두 입력 반복자
출력 반복자의 요구사항을 만족하는 반복자 - 가변 반복자
아니면 상수(불변) 반복자
알고리즘마다 필요한 반복자를 지정하는 표준 방식은 반복자 템플릿 타입 인수에 이름을 넣는것
타입검사 기능이 없으므로 반복자 타입을 지정하고 다른 타입의 반복자를 사용해도 에러가 발생하지 않음
다만 알고리즘, 컨테이너에 따라 알 수 없는 에러가 발생하는 경우가 많으므로 조심
'
# 반복자는 알고리즘과 컨테이너를 중계함.
17.1.1 컨테이너에서 반복자 받기
반복자를 지원하는 표준 라이브러리의 컨테이너 클래스는 모두 반복자 타입에 대해 public 타입 앨리어스인 iterator와 const_iterator를 제공함
컨테이너는 반복자를 리턴하는 begin()과 end() 메서드를 제공함
begin() - 첫번째 항목을 참조하는 반복자를 리턴
end() - 마지막 항목의 바로 다음 원소에 해당하는 지점을 가리키는 반복자 리턴
즉 첫번째 원소는 포함하지만 마지막 원소는 포함하지 않는 반개방 범위 지원 [begin,end)
빈 구간일때 begin()과 end()의 결과가 같다
const 반복자를 리턴하는 cbegin(), cend()
역방향 반복자를 리턴하는 rbegin(), rend()
<iterator>에서 컨테이너의 특정 반복자를 리턴하는 글로벌 비 멤버 함수도 제공함
using std::begin;
begin(...);
std 안붙이면 begin() 호출됨
인수 의존 검색이 적용되기 때문
#인수 의존 검색 - 함수의 네임스페이스가 명시되지 않아도 인수의 네임스페이스를 따라서 함수를 찾아감
17.1.2 iterator_traits
일부 알고리즘 구현에서는 반복자에 대한 정보가 필요한 경우가 있다.
임싯값을 저장하기 위해 반복자가 참조하는 원소의 타입을 알아야 하는 경우도 있고, 반복자가 양방향 접근 방식인지 임의 접근 방식인지 알아야 할 수도 있다
17.2 스트림 반복자
반복자처럼 생긴 클래스 템플릿
입출력 스트림을 입출력 반복자처럼 사용가능
17.2.1 ostream_iterator
출력 스트림 반복자. 원소의 타입을 매개변수로 받는 클래스 템플릿
생성자는 출력 스트림과 이 스트림의 원소 끝마다 붙일 string 타입의 구분자를 인수로 받음
시작~끝 범위를 타겟의 시작 반복자에 복제하는 함수 템플릿
이를 vector - vector의 이터레이터들로 사용하면 벡터 원소를 복제하는데 사용할 수 있다
그런데 타겟 이터레이터를 출력스트림 이터레이터로 설정하면 화면에 출력하는 함수로 사용할 수도 있다
입력 스트림 이터레이터도 비슷하게 사용하면 입력값을 모두 더하는 함수를 한줄로 사용하는등 편리하다
17.3 반복자 어댑터
특수 반복자. 다섯가지 버전
1. 컨테이너에서 생성되며 출력 반복자로 주로 사용됨
- back_insert_iterator: push_back()로 원소를 컨테이너에 추가함
- front_insert_iterator: push_front() 로 원소를 컨테이너에 추가함
- insert_iterator: insert()로 원소를 컨테이너에 추가함
2. 컨테이너가 아닌 다른 반복자에서 생성되며 주로 입력 반복자로 사용됨
- reverse_iterator: 다른 반복자의 반복 순서를 반대로 전환
- move_iterator: move_iterator의 역참조 연산자는 주어진 값을 자동으로 우측값 레퍼런스로 변환. 새로운 곳으로 이동시킬 수 있다.
17.3.1 추가 반복자
그러니까 이런식으로 아까 myCopy 함수에 집어넣으면 back_insert_iterator가 push_back()으로 작동하여 vectorTwo에 vectorOne 원소들을 push_back() 한다네요
대상 컨테이너의 크기를 미리 계산해서 for문을 돌리지 않고 데이터를 옮기는 방법
유틸리티 함수인 std::back_inserter()로 똑같은 일을 할 수 있다
이렇게
insert_iterator를 이용하면 연관 컨테이너를 변경 알고리즘의 대상으로 사용가능
연관 컨테이너(set이나 map 같은거)는 반복하는 동안 원소를 수정할 수 없다
insert_iterator를 사용하면 원소를 추가하게 만들 수 있다
~870
'전문가를 위한 C++' 카테고리의 다른 글
2025/04/09 ch.18 표준 라이브러리 컨테이너 (0) | 2025.04.09 |
---|---|
2025/04/08 ch.17 반복자와 범위 라이브러리 (0) | 2025.04.08 |
2025/04/06 ch.16 C++ 표준 라이브러리 둘러보기 (0) | 2025.04.07 |
2025/03/28 ch.15 연산자 오버로딩 (0) | 2025.03.28 |
2025/03/27 ch.15 연산자 오버로딩 (0) | 2025.03.27 |