Namespaces
Variants

std::ranges::size

cppreference.net에서
 
 
범위 라이브러리
범위 어댑터
 
헤더 <ranges>
에 정의됨<iterator>
inline namespace /* unspecified */ {
    inline constexpr auto size = /* unspecified */;
}
(C++20부터)
(사용자 정의 지점 객체)
호출 시그니처
template< class T >
    requires /* see below */
constexpr auto size( T&& t );
(C++20부터)

t의 요소 수를 상수 시간에 계산합니다.

부분식이 주어졌을 때, 여기서 t은 (잠재적으로 구체화된) 결과 객체를 E로 나타내고, E의 타입은 T입니다:

  • 만약 T이 경계를 알 수 없는 배열이면, ranges::size(E)는 잘못된 형식(ill-formed)입니다.
  • 그렇지 않고, T이 배열 타입이면, ranges::size(E)는 표현식-동등하여 decay-copy (std::extent_v<T>)(C++23까지)auto(std::extent_v<T>)(C++23부터)입니다.
  • 그렇지 않고, 다음 모든 조건이 충족되면, ranges::size(E)는 표현식-동등하여 decay-copy (t.size())(C++23까지)auto(t.size())(C++23부터)입니다:
    • ranges::disable_sized_range<std::remove_cv_t<T>>는 false입니다.
    • decay-copy (t.size())(C++23까지)auto(t.size())(C++23부터)는 정수-유사 타입의 유효한 표현식입니다.
  • 그렇지 않고, 다음 모든 조건이 충족되면, ranges::size(E)는 표현식-동등하여 decay-copy (size(t))(C++23까지)auto(size(t))(C++23부터)입니다:
    • T는 클래스 또는 열거형 타입입니다.
    • ranges::disable_sized_range<std::remove_cv_t<T>>는 false입니다.
    • decay-copy (size(t))(C++23까지)auto(size(t))(C++23부터)는 정수-유사 타입의 유효한 표현식이며, 여기서 size의 의미는 인자-의존 검색만 수행하여 확립된 것처럼 결정됩니다.
  • 그렇지 않고, 다음 모든 조건이 충족되면, ranges::size(E)는 표현식-동등하여 to-unsigned-like (ranges::end(t) - ranges::begin(t))입니다:
  • 그렇지 않으면, ranges::size(E)는 잘못된 형식(ill-formed)입니다.

위의 진단 가능한 잘못된 형식 사례는 치환 실패를 초래하며, 이는 ranges::size(E)가 템플릿 인스턴스화의 즉시 문맥에 나타날 때 발생합니다.

커스터마이제이션 포인트 객체

ranges::size 이름은 커스터마이제이션 포인트 객체 를 나타내며, 이는 함수 객체 의 리터럴 리터럴 semiregular 클래스 타입의 const 객체입니다. 자세한 내용은 CustomizationPointObject 를 참조하십시오.

참고 사항

표현식 ranges :: size ( e ) 가 유효할 때마다, 반환 타입은 integer-like 입니다.

C++20 표준은 기본 size 함수 호출이 prvalue를 반환하는 경우, 반환 값이 구체화된 임시 객체에서 이동 생성되도록 요구합니다. 모든 구현체는 직접 prvalue를 반환합니다. 이 요구사항은 구현체와 일치하도록 C++20 이후 제안서 P0849R8 에 의해 수정되었습니다.

표현식 ranges:: distance ( e ) 는 범위 e 의 크기를 결정하는 데에도 사용될 수 있습니다. ranges :: size ( e ) 와 달리, ranges:: distance ( e ) 는 e 가 크기가 지정되지 않은 범위인 경우에도 작동하지만, 그 경우 선형 복잡도의 비용이 발생합니다.

예제

#include <iostream>
#include <ranges>
#include <type_traits>
#include <vector>
int main()
{
    auto v = std::vector<int>{};
    std::cout << "ranges::size(v) == " << std::ranges::size(v) << '\n';
    auto il = {7};     // std::initializer_list
    std::cout << "ranges::size(il) == " << std::ranges::size(il) << '\n';
    int array[]{4, 5}; // array has a known bound
    std::cout << "ranges::size(array) == " << std::ranges::size(array) << '\n';
    static_assert(std::is_signed_v<decltype(std::ranges::size(v))> == false);
}

출력:

ranges::size(v) == 0
ranges::size(il) == 1
ranges::size(array) == 2

결함 보고서

다음의 동작 변경 결함 보고서들은 이전에 발표된 C++ 표준에 소급 적용되었습니다.

DR 적용 대상 게시된 동작 올바른 동작
P2602R2 C++20 ADL 로 발견되는 특정 비멤버 size 를 금지하는 메커니즘이 존재함 해당 메커니즘 제거됨

참고 항목

범위의 크기와 동일한 부호 있는 정수를 반환함
(커스터마이제이션 포인트 객체)
범위가 상수 시간에 자신의 크기를 알 수 있음을 명시함
(컨셉)
반복자와 센티넬 사이의 거리, 또는 범위의 시작과 끝 사이의 거리를 반환함
(알고리즘 함수 객체)
(C++17) (C++20)
컨테이너나 배열의 크기를 반환함
(함수 템플릿)