std:: size, std:: ssize
|
헤더에 정의됨
<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
)
|
(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부터) |
주어진 범위의 크기를 반환합니다.
목차 |
매개변수
| c | - |
size
멤버 함수를 가진 컨테이너 또는 뷰
|
| array | - | 임의 타입의 배열 |
반환값
std:: make_signed_t < decltype ( c. size ( ) ) >>> ( c. size ( ) )
예외
오버로드
적절한
size()
멤버 함수를 노출하지 않지만 감지될 수 있는 클래스 및 열거형에 대해
size
의 사용자 정의 오버로드를 제공할 수 있습니다.
|
인수 종속 lookup
으로 발견된
|
(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) |
|
|
(C++20)
|
범위의 크기와 같은 정수를 반환함
(customization point object) |
|
(C++20)
|
범위의 크기와 같은 부호 있는 정수를 반환함
(customization point object) |