Namespaces
Variants

std::ranges:: size

From cppreference.net
Ranges library
Range adaptors
ヘッダーで定義 <ranges>
ヘッダーで定義 <iterator>
inline namespace /* unspecified */ {

inline constexpr auto size = /* unspecified */ ;

}
(C++20以降)
(カスタマイゼーションポイントオブジェクト)
呼び出しシグネチャ
template < class T >

requires /* see below */

constexpr auto size ( T && t ) ;
(C++20以降)

t 内の要素数を定数時間で計算します。

与えられた 部分式 において、 t が( 実体化された 可能性もある)結果オブジェクトを表し、 E がその式を表し、 E の型が T である場合:

上記の診断可能な不適格なケースは、テンプレートのインスタンス化の直接のコンテキスト内で substitution failure が発生した場合に ranges :: size ( E ) が現れると結果となります。

目次

カスタマイゼーションポイントオブジェクト

名前 ranges::size カスタマイゼーションポイントオブジェクト を表し、これは 関数オブジェクト のconstな リテラル semiregular クラス型である。詳細は CustomizationPointObject を参照。

注記

ranges :: size ( e ) が有効である場合、戻り値の型は integer-like です。

C++20標準では、基となる size 関数呼び出しがprvalueを返す場合、戻り値は具体化された一時オブジェクトからムーブ構築されることが要求されていました。しかし、すべての実装では直接prvalueを返しています。この要件は、C++20以降の提案 P0849R8 によって実装に合わせて修正されました。

ranges:: distance ( e ) は範囲 e のサイズを決定するためにも使用できます。 ranges :: size ( e ) とは異なり、 ranges:: distance ( e ) e がサイズ指定のない範囲である場合でも機能しますが、その場合には線形計算量というコストがかかります。

#include <iostream>
#include <ranges>
#include <type_traits>
#include <vector>
int main()
{
    auto v = std::vector<int>{};
    std::cout << "ranges::size(v) == " << std::ranges::size(v) << '\n';
    auto il = {7};     // std::initializer_list
    std::cout << "ranges::size(il) == " << std::ranges::size(il) << '\n';
    int array[]{4, 5}; // array has a known bound
    std::cout << "ranges::size(array) == " << std::ranges::size(array) << '\n';
    static_assert(std::is_signed_v<decltype(std::ranges::size(v))> == false);
}

出力:

ranges::size(v) == 0
ranges::size(il) == 1
ranges::size(array) == 2

不具合報告

以下の動作変更の欠陥報告書は、以前に公開されたC++規格に対して遡及的に適用されました。

DR 適用対象 公開時の動作 正しい動作
P2602R2 C++20 ADL によって発見される特定の非メンバー size を禁止する仕組みが存在する そのような仕組みを削除

関連項目

範囲のサイズに等しい符号付き整数を返す
(カスタマイゼーションポイントオブジェクト)
範囲が定数時間でそのサイズを知ることを指定する
(コンセプト)
イテレータとセンチネル間、または範囲の先頭と終端間の距離を返す
(アルゴリズム関数オブジェクト)
(C++17) (C++20)
コンテナまたは配列のサイズを返す
(関数テンプレート)