Namespaces
Variants

std::size, std::ssize

ja.cppreference.net より
 
 
イテレータライブラリ
イテレータコンセプト
イテレータプリミティブ
アルゴリズムのコンセプトとユーティリティ
間接呼び出し可能コンセプト
共通アルゴリズム要件
(C++20)
(C++20)
(C++20)
ユーティリティ
(C++20)
イテレータアダプタ
範囲アクセス
(C++11)(C++14)
(C++14)(C++14)  
(C++11)(C++14)
(C++14)(C++14)  
(C++17)(C++20)
(C++17)
(C++17)
 
ヘッダ <array>
で定義<deque>
ヘッダ <flat_map>
  で定義(C++23以降)
ヘッダ <flat_set>
  で定義(C++23以降)
ヘッダ <forward_list>
で定義<inplace_vector>
 ヘッダ
で定義(C++26以降)<iterator>
ヘッダ <list>
で定義<map>
ヘッダ <optional>
  で定義(C++26以降)
ヘッダ <regex>
で定義<set>
ヘッダ <span>
  で定義(C++20以降)
ヘッダ <stacktrace>
  で定義(C++23以降)
ヘッダ <string>
で定義<string_view>
ヘッダ <unordered_map>
で定義<unordered_set>
ヘッダ <valarray>
で定義<vector>
template< class C >
constexpr auto size( const C& c ) noexcept(noexcept(c.size()))
    -> decltype(c.size());
(1) (C++17以降)
template< class C >
constexpr auto ssize( const C& c ) noexcept(noexcept(c.size()))
    -> 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

欠陥報告

以下の動作を変更する欠陥報告は、以前に公開されたC++標準に遡って適用されました。

DR 適用先 公開時の動作 修正後の動作
P3016R6 C++17
C++20
1) std::size は例外仕様を伝播することが要求されていなかった
2) std::ssize は例外仕様を伝播することが要求されていなかった
要求される

関連項目

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