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)
(注:このHTML要素には翻訳対象となるテキストコンテンツが含まれていません。すべてのHTMLタグと属性は原文のまま保持されています。)
定義済みヘッダー <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 のカスタムオーバーロードを提供することができます。

実引数依存の名前探索 によって発見された 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;
}

注記

機能テスト マクロ 標準 機能
__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

関連項目

2つのポインタを減算したときに返される符号付き整数型
(typedef)
sizeof 演算子によって返される符号なし整数型
(typedef)
範囲のサイズに等しい整数を返す
(カスタマイゼーションポイントオブジェクト)
範囲のサイズに等しい符号付き整数を返す
(カスタマイゼーションポイントオブジェクト)