Namespaces
Variants

std:: size, std:: ssize

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)
size ssize
(C++17) (C++20)
(C++17)
(C++17)
헤더에 정의됨 <array>
헤더 파일에 정의됨 <deque>
헤더에 정의됨 <flat_map>
헤더에 정의됨 <flat_set>
헤더 파일에 정의됨 <forward_list>
헤더에 정의됨 <inplace_vector>
헤더에 정의됨 <iterator>
헤더 파일에 정의됨 <list>
헤더 파일에 정의됨 <map>
헤더 파일에 정의됨 <regex>
헤더 파일에 정의됨 <set>
헤더에 정의됨 <span>
헤더 파일에 정의됨 <string>
헤더에 정의됨 <string_view>
헤더 파일에 정의됨 <unordered_map>
헤더 파일에 정의됨 <unordered_set>
헤더 파일에 정의됨 <vector>
template < class C >
constexpr auto size ( const C & c ) - > decltype ( c. size ( ) ) ;
(1) (C++17부터)
template < class C >

constexpr auto ssize ( const C & c )
- > std:: common_type_t < std:: ptrdiff_t ,

std:: make_signed_t < decltype ( c. size ( ) ) >> ;
(2) (C++20부터)
template < class T, std:: size_t N >
constexpr std:: size_t size ( const T ( & array ) [ N ] ) noexcept ;
(3) (C++17부터)
template < class T, std:: ptrdiff_t N >
constexpr std:: ptrdiff_t ssize ( const T ( & array ) [ N ] ) noexcept ;
(4) (C++20부터)

주어진 범위의 크기를 반환합니다.

1,2) c. size ( ) 를 반환하며, 필요한 경우 반환 타입으로 변환합니다.
3,4) 반환값 N .

목차

매개변수

c - size 멤버 함수를 가진 컨테이너 또는 뷰
array - 임의 타입의 배열

반환값

1) c. size ( )
2) static_cast < std:: common_type_t < std:: ptrdiff_t ,
std:: make_signed_t < decltype ( c. size ( ) ) >>> ( c. size ( ) )
3,4) N

예외

1,2) 구현 시 정의된 예외를 발생시킬 수 있습니다.

오버로드

적절한 size() 멤버 함수를 노출하지 않지만 감지될 수 있는 클래스 및 열거형에 대해 size 의 사용자 정의 오버로드를 제공할 수 있습니다.

인수 종속 lookup 으로 발견된 size 의 오버로드는 std :: ranges:: size , std :: ranges:: ssize , 그리고 std :: ranges:: empty 의 동작을 사용자 정의하는 데 사용될 수 있습니다.

(C++20부터)

가능한 구현

size (1)
template<class C>
constexpr auto size(const C& c) -> decltype(c.size())
{
    return c.size();
}
ssize (2)
template<class C>
constexpr auto ssize(const C& c)
    -> std::common_type_t<std::ptrdiff_t,
                          std::make_signed_t<decltype(c.size())>>
{
    using R = std::common_type_t<std::ptrdiff_t,
                                 std::make_signed_t<decltype(c.size())>>;
    return static_cast<R>(c.size());
}
size (3)
template<class T, std::size_t N>
constexpr std::size_t size(const T (&array)[N]) noexcept
{
    return N;
}
ssize (4)
template<class T, std::ptrdiff_t N>
constexpr std::ptrdiff_t ssize(const T (&array)[N]) noexcept
{
    return N;
}

참고 사항

Feature-test 매크로 표준 기능
__cpp_lib_nonmember_container_access 201411L (C++17) std::size() , std::data std::empty
__cpp_lib_ssize 201902L (C++20) std::ssize() ( 2,4 ) 및 부호 없는 std::span::size()

예제

#include <cassert>
#include <cstring>
#include <iostream>
#include <vector>
int main()
{
    // 컨테이너와 함께 동작
    std::vector<int> v{3, 1, 4};
    assert(std::size(v) == 3);
    // 내장 배열과도 동작
    int a[]{-5, 10, 15};
    // sizeof와 달리 요소의 개수를 반환 (바이트 수가 아님)
    assert(std::size(a) == 3);
    std::cout << "size of a[]: " << sizeof a << '\n'; // sizeof(int) == 4일 경우 12
    // 문자열 버퍼 크기를 얻는 안전한 방법 제공 (sizeof에 비해)
    const char str[] = "12345";
    // 다음은 정상적으로 동작하며 올바른 결과를 제공
    assert(std::size(str) == 6);
    assert(sizeof(str) == 6);
    // 하지만 여기서 sizeof 사용은 흔한 버그 원인
    const char* str_decayed = "12345";
    // std::cout << std::size(str_decayed) << '\n'; // 유용하게 컴파일 실패
    std::cout << sizeof(str_decayed) << '\n'; // 포인터의 크기를 출력!
    // C++20부터 부호 있는 크기(std::ssize) 사용 가능
    auto i = std::ssize(v);
    for (--i; i != -1; --i)
        std::cout << v[i] << (i ? ' ' : '\n');
    assert(i == -1);
    // 문자열 리터럴은 널 종료 문자를 포함하며,
    // 이는 생성된 문자 배열의 일부가 됩니다. 이로 인해 std::size는
    // std::strlen 및 std::string::size와 다르게 동작합니다:
    constexpr char symbols[] = "0123456789";
    static_assert(std::size(symbols) == 11);
    static_assert(std::string(symbols).size() == 10);
    assert(std::strlen(symbols) == 10);
}

가능한 출력:

size of a[]: 12
8
4 1 3

참고 항목

두 포인터를 뺄 때 반환되는 부호 있는 정수 타입
(typedef)
sizeof 연산자가 반환하는 부호 없는 정수 타입
(typedef)
범위의 크기와 같은 정수를 반환함
(customization point object)
범위의 크기와 같은 부호 있는 정수를 반환함
(customization point object)