std:: counted_iterator
From cppreference.net
|
헤더 파일에 정의됨
<iterator>
|
||
|
template
<
std::
input_or_output_iterator
I
>
class counted_iterator ; |
(C++20부터) | |
std::counted_iterator
는 기본 반복자와 동일하게 동작하는 반복자 어댑터로, 범위의 끝까지 남은 거리를 추적한다는 점만 다릅니다. 이 반복자는 카운트가 0에 도달했을 때에만
std::default_sentinel
와 동일하게 판단됩니다.
목차 |
멤버 타입
| 멤버 타입 | 정의 |
iterator_type
|
I
|
value_type
(조건부 존재) |
std::
iter_value_t
<
I
>
만약
I
가
indirectly_readable
를 모델링하면; 그렇지 않으면 정의되지 않음
|
difference_type
|
std:: iter_difference_t < I > |
iterator_concept
(조건부 존재) |
I :: iterator_concept 존재하는 경우; 그렇지 않으면 정의되지 않음 |
iterator_category
(조건부 존재) |
I :: iterator_category 존재하는 경우; 그렇지 않으면 정의되지 않음 |
멤버 객체
| 멤버 이름 | 정의 |
current
(private)
|
base()
가 접근하는 기본 반복자
( 설명 전용 멤버 객체* ) |
length
(private)
|
기본 반복자와 해당 범위의 끝 사이의 거리
( 설명 전용 멤버 객체* ) |
멤버 함수
새로운
counted_iterator
를 생성합니다
(public member function) |
|
다른
counted_iterator
를 할당합니다
(public member function) |
|
|
기본 반복자에 접근합니다
(public member function) |
|
|
끝까지의 거리를 반환합니다
(public member function) |
|
|
가리키는 요소에 접근합니다
(public member function) |
|
|
인덱스로 요소에 접근합니다
(public member function) |
|
counted_iterator
를 전진시키거나 후퇴시킵니다
(public member function) |
비멤버 함수
|
(C++20)
|
끝까지의 거리를 비교함
(함수 템플릿) |
끝까지의 거리가
0
인지 확인함
(함수 템플릿) |
|
|
(C++20)
|
반복자를 전진시킴
(함수 템플릿) |
|
(C++20)
|
두 반복자 어댑터 사이의 거리를 계산함
(함수 템플릿) |
|
끝까지의 부호 있는 거리를 계산함
(함수 템플릿) |
|
|
(C++20)
|
기본 반복자를 역참조한 결과를 해당하는 rvalue 참조 타입으로 변환함
(함수) |
|
(C++20)
|
두 기본 반복자가 가리키는 객체를 교환함
(함수 템플릿) |
헬퍼 클래스
|
std::counted_iterator
타입의 속성에 대한 통일된 인터페이스를 제공함
(클래스 템플릿 특수화) |
예제
이 코드 실행
#include <algorithm> #include <iostream> #include <iterator> #include <string> #include <vector> using std::operator""s; void print(auto const remark, auto const& v) { const auto size = std::ssize(v); std::cout << remark << '[' << size << "] { "; for (auto it = std::counted_iterator{std::cbegin(v), size}; it != std::default_sentinel; ++it) std::cout << *it << (it.count() > 1 ? ", " : " "); std::cout << "}\n"; } int main() { const auto src = {"Arcturus"s, "Betelgeuse"s, "Canopus"s, "Deneb"s, "Elnath"s}; print("src", src); std::vector<decltype(src)::value_type> dst; std::ranges::copy(std::counted_iterator{src.begin(), 3}, std::default_sentinel, std::back_inserter(dst)); print("dst", dst); }
출력:
src[5] { Arcturus, Betelgeuse, Canopus, Deneb, Elnath }
dst[3] { Arcturus, Betelgeuse, Canopus }
결함 보고서
다음의 동작 변경 결함 보고서들은 이전에 발표된 C++ 표준에 소급 적용되었습니다.
| DR | 적용 대상 | 게시된 동작 | 올바른 동작 |
|---|---|---|---|
| P2259R1 | C++20 |
멤버 typedef가 제공되지 않음
std::incrementable_traits
가
counted_iterator
에 대해 특수화됨
|
멤버 typedef가 추가되어
iterator_traits
수정을 반영
중복된 std::incrementable_traits 특수화가 제거됨 |
참고 항목
|
(C++20)
|
자신의 범위 경계를 알고 있는 반복자와 함께 사용하기 위한 기본 센티널
(클래스) |
|
(C++20)
|
반복자와 개수로부터 서브레인지를 생성함
(커스터마이제이션 포인트 객체) |
|
(C++20)
|
다른
view
의 첫 N개 요소로 구성된
view
(클래스 템플릿) (레인지 어댑터 객체) |