std::size, std::ssize
| ヘッダ <array>
|
||
| で定義 <deque>
|
||
| ヘッダ <flat_map>
|
で定義(C++23以降) |
|
| ヘッダ <flat_set>
|
で定義(C++23以降) |
|
| ヘッダ <forward_list>
|
||
ヘッダ |
||
| で定義(C++26以降) <iterator>
|
||
| ヘッダ <list>
|
||
| で定義 <map>
|
||
| ヘッダ <optional>
|
で定義(C++26以降) |
|
| ヘッダ <regex>
|
||
| で定義 <set>
|
||
| ヘッダ <span>
|
で定義(C++20以降) |
|
| ヘッダ <stacktrace>
|
で定義(C++23以降) |
|
| ヘッダ <string>
|
||
| ヘッダ <unordered_map>
|
||
| ヘッダ <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以降) |
指定された範囲のサイズを返します。
c.size() を返します。必要に応じて戻り値の型に変換されます。N を返します。パラメータ
| c | - |
sizeメンバ関数を持つコンテナまたはビュー
|
| array | - | 任意の型の配列 |
戻り値
std:: make_signed_t < decltype ( c. size ( ) ) >>> ( c. size ( ) )
例外
オーバーロード
適切な
size()
メンバ関数を公開していないが、検出可能なクラスおよび列挙型に対して、
size
のカスタムオーバーロードを提供することができます。
|
実引数依存の名前探索
によって発見された
|
(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) |
|
|
(C++20)
|
範囲のサイズに等しい整数を返す
(カスタマイゼーションポイントオブジェクト) |
|
(C++20)
|
範囲のサイズに等しい符号付き整数を返す
(カスタマイゼーションポイントオブジェクト) |