Namespaces
Variants

std::ranges:: size

From cppreference.net
Ranges library
Range adaptors
헤더에 정의됨 <ranges>
헤더에 정의됨 <iterator>
inline namespace /* unspecified */ {

inline constexpr auto size = /* unspecified */ ;

}
(C++20부터)
(customization point object)
호출 시그니처
template < class T >

requires /* see below */

constexpr auto size ( T && t ) ;
(C++20부터)

t 내 원소의 개수를 상수 시간에 계산합니다.

주어진 부분식 에서 t 가 ( 구체화된 가능성이 있는) 결과 객체를 나타내고, E 의 타입이 T 인 경우:

위에서 진단 가능한 잘못 형성된 경우들은 치환 실패 를 초래합니다. 이는 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)
컨테이너나 배열의 크기를 반환함
(함수 템플릿)