2 분 소요

이터레이터 기본 요소

항목 내용
iterator (~C++17) (작성중)
iterator_traits (작성중)
input_iterator_tag
output_iterator_tag
forward_iterator_tag
bidirectional_iterator_tag
random_access_iterator_tag
input_iterator_tag
contiguous_iterator_tag (C++20~)
(작성중)

이터레이터 어뎁터

역방향 이터레이터삽입 이터레이터와 같이 이터레이터의 고유 기능인 *, ->``, ++을 재구현하여 다르게 동작하는 이터레이터들입니다.

항목 내용
reverse_iterator 역방향으로 이터레이트 합니다.
make_reverse_iterator() (C++14~) (작성중)
back_insert_iterator 컨테이너 끝에 삽입합니다.(삽입 이터레이터 참고)
back_inserter() back_insert_iterator를 생성합니다.
front_insert_iterator 컨테이너 앞에 삽입합니다.
front_inserter() front_insert_iterator를 생성합니다.
insert_iterator 컨테이너에 삽입합니다.
inserter() insert_iterator를 생성합니다.
move_iterator (C++11~) 이터레이터가 가리키는 요소를 이동 연산 합니다.
make_move_iterator() (C++11~) move_iterator를 생성합니다.
basic_const_iterator (C++23~) (작성중)
const_iterator (C++23~) (작성중)
const_sentinel (C++23~) (작성중)
make_const_iterator() (C++23~) (작성중)
move_sentinel (C++23~) (작성중)
common_iterator (C++20~) (작성중)
default_sentinel_t (C++20~) (작성중)
counted_iterator (C++20~) (작성중)
unreachable_sentinel_t (C++20~) (작성중)

다음은 move_iterator 사용 예입니다. move_iterator를 통해 v2를 생성하면, 요소가 이동되는 것을 알 수 있습니다.

1
2
3
4
5
6
7
std::vector<std::string> v{"a", "b", "c"};

std::vector<std::string> v1{v.begin(), v.end()};
EXPECT_TRUE(v[0] == "a" && v[1] == "b" && v[2] == "c"); // 요소가 복사됩니다.

std::vector<std::string> v2{std::make_move_iterator(v.begin()), std::make_move_iterator(v.end())};
EXPECT_TRUE(v[0].empty() && v[1].empty() && v[2].empty()); // 요소가 이동되어 비었습니다.

스트림 이터레이터

항목 내용
istream_iterator basic_istream에서 사용하는 입력용 이터레이터
ostream_iterator basic_ostream에서 사용하는 출력용 이터레이터
istreambuf_iterator basic_streambuf에서 사용하는 입력용 이터레이터
ostreambuf_iterator basic_streambuf에서 사용하는 출력용 이터레이터

이터레이터 유틸리티

항목 내용
advance() 이터레이터를 이동시킵니다.
distance() 이터레이터간 거리를 구합니다.
next() (C++11~) 뒤로 이동된 이터레이터를 리턴합니다.
prev() (C++11~) 앞으로 이동된 이터레이터를 리턴합니다.

다음 예제는 advance()next(), prev()의 차이를 보여줍니다.

advance()인자로 전달한 이터레이터를 직접 수정하지만, next()prev()는 수정하지 않습니다.

1
2
3
4
5
6
7
8
std::vector<int> v{1, 2, 3, 4};
auto itr{v.begin()};
std::advance(itr, 2); // 인자로 전달한 이터레이터를 뒤로 2번 이동시킴
EXPECT_TRUE(*itr == 3);

itr = v.begin();
EXPECT_TRUE(*std::next(itr, 2) == 3 && *itr == 1); // 뒤로 2번 이동. itr은 수정되지 않음
EXPECT_TRUE(*std::prev(itr, -2) == 3 && *itr == 1); // 앞으로 -2번 이동. itr은 수정되지 않음

(C++11~) 이터레이터 접근 유틸리티

항목 내용
begin(), end() (C++11~) 순방향 이터레이터를 리턴합니다.
rbegin(), rend() (C++14~) 역방향 이터레이터를 리턴합니다.
cbegin(), cend() (C++14~) 순방향 이터레이터를 리턴합니다. 이때 요소를 수정할 수 없습니다.
crbegin(), crend() (C++14~) 역방향 이터레이터를 리턴합니다. 이때 요소를 수정할 수 없습니다.
size() (C++17~) 컨테이너의 크기를 구합니다.
ssize() (C++20~) 컨테이너의 크기를 부호 있는 signed 타입으로 구합니다.
empty() (C++17~) 컨테이너가 비었는지 검사합니다.
data() (C++17~) 컨테이너가 관리하는 메모리 블록을 리턴합니다.

(C++20~) 이터레이터 사용자 정의

항목 내용
iter_move() (C++20~) (작성중)
iter_swap() (C++20~) (작성중)

(C++20~) 이터레이터 연관 타입

항목 내용
incrementable_traits (C++20~) (작성중)
iter_value_t (C++20~)
iter_reference_t (C++20~)
iter_const_reference_t (C++23~)
iter_difference_t (C++20~)
iter_rvalue_reference_t (C++20~)
iter_common_reference_t (C++20~)
(작성중)

태그:

카테고리:

업데이트:

댓글남기기