- (C++11~) move_iterator 어뎁터가 추가되어 이터레이터가 가리키는 요소를 이동 연산 할 수 있습니다.
- (C++11~) make_move_iterator가 추가되었습니다.
- (C++11~) next()와 prev()가 추가되었습니다.
- (C++11~) begin(), end()가 추가되었습니다.
- (C++14~) make_reverse_iterator()가 추가되었습니다.
- (C++14~) rbegin(), rend(), cbegin(), cend(), crbegin(), crend()가 추가되었습니다.
- (C++17~) size(), empty(), data()가 추가되었습니다.
- (C++20~) ssize()가 추가되어 컨테이너의 크기를 부호 있는
signed
타입으로 구할 수 있습니다.
- (C++20~) common_iterator, default_sentinel_t, counted_iterator, unreachable_sentinel_t가 추가되었습니다.
- (C++20~) 이터레이터 사용자 정의가 추가되었습니다.
- (C++20~) 이터레이터 연관 타입이 추가되었습니다.
이터레이터 기본 요소
항목 |
내용 |
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()
와 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~)
|
(작성중) |
댓글남기기