Namespaces
Variants

std:: counted_iterator

From cppreference.net
Iterator library
Iterator concepts
Iterator primitives
Algorithm concepts and utilities
Indirect callable concepts
Common algorithm requirements
(C++20)
(C++20)
(C++20)
Utilities
(C++20)
Iterator adaptors
Range access
(C++11) (C++14)
(C++14) (C++14)
(C++11) (C++14)
(C++14) (C++14)
(C++17) (C++20)
(C++17)
(C++17)
헤더 파일에 정의됨 <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)

비멤버 함수

끝까지의 거리를 비교함
(함수 템플릿)
끝까지의 거리가 ​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 특수화가 제거됨

참고 항목

자신의 범위 경계를 알고 있는 반복자와 함께 사용하기 위한 기본 센티널
(클래스)
반복자와 개수로부터 서브레인지를 생성함
(커스터마이제이션 포인트 객체)
다른 view 의 첫 N개 요소로 구성된 view
(클래스 템플릿) (레인지 어댑터 객체)