次の方法で共有


<ranges> 関数

<ranges>C++20 ヘッダーには、次の非メンバー ヘルパー関数が含まれています。

非メンバー関数 説明
beginC++20 範囲内の最初の要素を指す反復子を取得します。
cbeginC++20 範囲内の最初の要素を指す const 反復子を取得します。
cendC++20 const修飾範囲の末尾にある sentinel を取得します。
cdataC++20 連続した範囲内の最初の要素への const ポインターを取得します。
crbeginC++20 範囲の先頭を指す反転 const 反復子を取得します。
crendC++20 crbegin()が返す内容の最後にセンチネルを取得します。
dataC++20 連続する範囲内の最初の要素へのポインターを取得します。
emptyC++20 範囲が空かどうかをテストします。
endC++20 範囲の末尾にあるセンチネルを取得します。
rbeginC++20 範囲の先頭を指す逆反復子を取得します。
rendC++20 範囲の末尾にあるセンチネルを指す逆反復子を取得します。
sizeC++20 範囲のサイズを符号なし値として取得します。
ssizeC++20 範囲のサイズを符号付き値として取得します。

これらの関数の多くは、 カスタマイズ ポイント オブジェクトとして実装されています。 カスタマイズ ポイント オブジェクトはユーザー定義型でオーバーロードできる関数オブジェクトですが、関数オブジェクトに渡すことができる型に対する制約も適用されます。 その結果、コンパイラは、渡された型を呼び出す有効なカスタマイズされた関数があるかどうか、または既定の実装を使用する必要があるかどうか、または呼び出しの形式が正しくないかどうかを判断します。

これらの関数の多くは、 std 名前空間に対応する関数を持っています。 ただし、範囲を操作する場合は、代わりにこれらのヘルパー関数を使用してください。 これらの関数では C++20 の概念が使用されるため、コンパイル時エラーが向上します。 これらはカスタマイズ ポイントとして実装されているため、引数依存参照 (ADL) と const の正確性に関連する問題は回避されます。

begin

範囲内の最初の要素を指す反復子を取得します。

template<class T>
constexpr std::input_or_output_iterator auto begin(T&& rg);

パラメーター

T
範囲の型。

rg
範囲。

戻り値

範囲内の最初の要素を指す反復子:

要素 10、20、30 を持つベクトルの図。最初の要素には 10 が含まれており、'begin()' というラベルが付けられます。最後の要素には 30 が含まれており、

範囲が配列の場合は、 rg + 0と同等の値を返します。 auto(rg.begin())反復子が生成された場合は、auto(rg.begin())と同等の値を返します。 その式の形式が正しくありません。その式が反復子を生成する場合は、 auto(begin(rg)) が使用されます。

解説

ranges::begin() は、すべての範囲で機能しますが、 std::begin() は機能しない場合があります。

例: begin

// requires /std:c++20 or later
#include <vector>
#include <ranges>
#include <iostream>

int main()
{
    std::vector<int> v = {10, 20, 30};
    auto vi = std::ranges::begin(v);
    std::cout << *vi << ' ' << *++vi; // outputs 10 20
}

cbegin

範囲内の最初の要素を指す const 反復子を取得します。 反復子は範囲内の要素にアクセスできますが、変更することはできません。

template<class T>
constexpr std::input_or_output_iterator auto cbegin(T&& rg);

パラメーター

T
範囲の型。

rg
範囲。

戻り値

範囲内の最初の要素を指す const 反復子。

要素 10、20、30 を持つベクトルの図。最初の要素には 10 が含まれており、'cbegin()' というラベルが付けられます。最後の要素には 30 が含まれており、

範囲が配列の場合は、 rg + 0と同等の値を返します。 auto(rg.cbegin())反復子が生成された場合は、auto(rg.cbegin())と同等の値を返します。 その式の形式が正しくありません。その式が反復子を生成する場合は、 auto(cbegin(rg)) が使用されます。

解説

ranges::cbegin() は、すべての範囲で機能しますが、 std::cbegin() は機能しない場合があります。

例: cbegin

// requires /std:c++20 or later
#include <vector>
#include <ranges>
#include <iostream>

int main()
{
    std::vector<int> v = {10, 20, 30};
    auto vi = std::ranges::cbegin(v);
    std::cout << *vi; // outputs 10
    // *vi = 100; // error because the iterator is const
}

cdata

連続した範囲内の最初の要素への const ポインターを取得します。

template<class T>
constexpr std::add_pointer_t<ranges::range_reference_t<const T>> cdata(T&& rg);

パラメーター

T
範囲の型。

rg
範囲。

戻り値

範囲の型に基づいて、連続する範囲内の最初の要素データへの const ポインター。 たとえば、範囲が整数のベクトルの場合、戻り値の型は const int *です。

例: cdata

#include <ranges>
#include <iostream>

int main()
{
    std::vector v{10, 20, 30};
    std::string src{ "a string" };
   
    auto c_charPtr = std::ranges::cdata(src); // ptr is a const char *
    auto c_intPtr = std::ranges::cdata(v); // ptr2 is a const int *
    std::cout << c_charPtr << ", " << *c_intPtr << '\n'; // outputs a string, 10

    // *c_intPtr = 100; // error - cannot assign to a const pointer
    // *charPtr = 'A'; // error - cannot assign to a const pointer
}

cend

const修飾範囲の末尾にある sentinel を取得します。 反復子は範囲内の要素にアクセスできますが、変更することはできません。

template<class T>
constexpr std::sentinel_for<decltype(ranges::cbegin(std::declval<T>()))> auto cend(T&& rg);

パラメーター

T
範囲の型。

rg
範囲。

戻り値

const修飾範囲の最後の要素に続く sentinel:

要素 10、20、30 を持つベクトルの図。最初の要素には 10 が含まれており、cbegin() というラベルが付いています。最後の要素には 30 が含まれており、

解説

ranges::cend() は、すべての範囲で機能しますが、 std::cend() は機能しない場合があります。

例: cend

// requires /std:c++20 or later
#include <vector>
#include <ranges>
#include <iostream>

int main()
{
    std::vector<int> v = {10, 20, 30};
    auto i = std::ranges::cend(v);
    --i; // get off the sentinel and onto the last element in the range
    std::cout << *i; // outputs 30
    // *i = 300 // error because the iterator is const
}

crbegin

反転された範囲内の最初の要素を指す反転 const 反復子を取得します。 反転反復子は、範囲の要素を逆順に返します。 範囲自体は反転されません。アクセス権を持つ必要があります。

template<class T>
constexpr std::input_or_output_iterator auto crbegin(T&& rg);

パラメーター

T
範囲の型。

rg
範囲。

戻り値

範囲内の最初の要素を指す反転 const 反復子。 この反復子は、範囲の末尾から、範囲の要素を逆の順序で返します。

要素 10、20、30 を含むベクターの図。センチネルを表す左端の要素 (左端の要素に数値 10 が含まれています) の前に架空のボックスがあります。crend() というラベルが付いています。ベクトル内の最初の要素には数値 10 が含まれており、

範囲が配列の場合は、配列内の要素の数nreverse_iterator{rg + n}に相当する値を返します。 auto(rg.crbegin())反復子が生成された場合は、auto(rg.crbegin())と同等の値を返します。 その式の形式が正しくありません。その式が反復子を生成する場合は、 auto(crbegin(rg)) が使用されます。

解説

ranges::crbegin() は双方向のすべての範囲で機能しますが、 std::crbegin() は機能しない場合があります。

例: crbegin

// requires /std:c++20 or later
#include <vector>
#include <ranges>
#include <iostream>

int main()
{
    std::vector v{10, 20, 30};
    auto vi = std::ranges::crbegin(v);
    std::cout << *vi << ' ' << *++vi << ' ' << *++vi; // outputs 30 20 10
    // vi[1] = 100; // error because the iterator is const
}

crend

crbegin()が返す内容の最後にセンチネルを取得します。 反転反復子は、範囲の要素を逆順に返します。 範囲自体は反転されません。アクセス権を持つ必要があります。

template<class T>
std::sentinel_for<decltype(ranges::crbegin(declval<T>()))> auto crend(T&& rg);

パラメーター

T
範囲の型。

rg
範囲。

戻り値

cbegin()が返す内容の末尾にあるセンチネル。 Sentinel は、範囲の反転ビューの最後の要素に従います。

要素 10、20、30 を含むベクターの図。センチネルを表す左端の要素 (左端の要素に数値 10 が含まれています) の前に架空のボックスがあります。crend() というラベルが付いています。ベクトル内の最初の要素には数値 10 が含まれており、

解説

ranges::crend() は双方向のすべての範囲で機能しますが、 std::crend() は機能しない場合があります。

crend の例

// requires /std:c++20 or later
#include <vector>
#include <ranges>
#include <iostream>

int main()
{
    std::vector v{10, 20, 30};
    auto vi = std::ranges::crend(v);
    --vi; // get off the sentinel and onto the last element in the reversed range
    std::cout << *vi; // outputs 10
    // vi[0] = 300; // error because the iterator is const    
    std::cout << *vi << ' ' << *--vi << ' ' << *--vi; // outputs 10, 20, 30
}

data

連続する範囲内の最初の要素へのポインターを取得します。

template<class T>
constexpr std::add_pointer_t<ranges::range_reference_t<T>> data(T&& rg);

パラメーター

T
範囲の型。

rg
範囲。

戻り値

範囲の型に基づく、連続する範囲内の最初の要素へのポインター。 たとえば、範囲が整数のベクトルの場合、戻り値の型は int *です。

// requires /std:c++20 or later
#include <vector>
#include <ranges>
#include <iostream>

int main()
{
    std::vector v{10, 20, 30};
    std::string src{ "a string" };
   
    auto charPtr = std::ranges::data(src); // charPtr is a char *
    auto intPtr = std::ranges::data(v); // intPtr is an int *
    std::cout << charPtr << ", " << *intPtr << '\n'; // outputs a string, 10
    *intPtr = 100;
    *charPtr = 'A';
    std::cout << charPtr << ", " << *intPtr; // outputs A string, 100
}

empty

範囲が空かどうかをテストします。

template<class T>
constexpr bool empty(T&& rg);

パラメーター

T
範囲の型。

rg
範囲。

戻り値

範囲に要素がない場合は true を返します。それ以外の場合は false

// requires /std:c++20 or later
#include <vector>
#include <ranges>
#include <iostream>

int main()
{
        std::vector v{10,20,30};
    std::vector<int> v2;

    std::cout << std::boolalpha << std::ranges::empty(v); // outputs false
    std::cout << std::boolalpha << ", " << std::ranges::empty(v2); // outputs true
}

end

範囲の末尾にあるセンチネルを取得します。

template<class T>
std::sentinel_for<ranges::iterator_t<T>> auto end(T&& rg);

パラメーター

T
範囲の型。

rg
範囲。

戻り値

範囲内の最後の要素に続くセンチネル:

要素 10、20、30 を持つベクトルの図。最初の要素には 10 が含まれており、begin() というラベルが付いています。最後の要素には 30 が含まれており、

解説

ranges::end() は、すべての範囲で機能しますが、 std::end() は機能しない場合があります。

// requires /std:c++20 or later
#include <vector>
#include <ranges>
#include <iostream>

int main()
{
    std::vector<int> v = {10, 20, 30};
    auto i = std::ranges::end(v);
    --i; // get off the sentinel and onto the last element in the range
    std::cout << *i; // outputs 30
}

rbegin

反転された範囲内の最初の要素を指す反転反復子を取得します。 反転反復子は、範囲の要素を逆順に返します。 範囲自体は反転されません。アクセス権を持つ必要があります。

template<class T>
constexpr std::input_or_output_iterator auto rbegin(T&& rg);

パラメーター

T
範囲の型。

rg
範囲。

戻り値

範囲内の最初の要素を指す逆反復子。 この反復子は、反転された範囲の末尾から、範囲の要素を逆順に返します。

要素 10、20、30 を含むベクターの図。センチネルを表す左端の要素 (左端の要素に数値 10 が含まれています) の前に架空のボックスがあります。rend() というラベルが付いています。ベクトル内の最初の要素には数値 10 が含まれており、

範囲が配列の場合は、配列内の要素の数nreverse_iterator{rg + n}に相当する値を返します。 auto(rg.rbegin())反復子が生成された場合は、auto(rg.rbegin())と同等の値を返します。 その式の形式が正しくありません。その式が反復子を生成する場合は、 auto(rbegin(rg)) が使用されます。

解説

ranges::rbegin() は双方向のすべての範囲で機能しますが、 std::rbegin() は機能しない場合があります。

// requires /std:c++20 or later
#include <vector>
#include <ranges>
#include <iostream>

int main()
{
    std::vector v{10, 20, 30};
    auto vi = std::ranges::rbegin(v);
    std::cout << *vi << ' ' << *++vi << ' ' << *++vi; // outputs 30 20 10
}

rend

範囲の反転ビューの末尾にあるセンチネルを指す逆反復子を取得します。 反転反復子は、範囲の要素を逆順に返します。 範囲自体は反転されません。アクセス権を持つ必要があります。

template<class T>
constexpr 
std::sentinel_for<decltype(ranges::rbegin(std::declval<T>()))> auto rend(T&& rg);

パラメーター

T
範囲の型。

rg
範囲。

戻り値

範囲の末尾にあるセンチネルを指す逆反復子。 Sentinel は、範囲の反転ビューの最後の要素に従います。

要素 10、20、30 を含むベクターの図。センチネルを表す左端の要素 (左端の要素に数値 10 が含まれています) の前に架空のボックスがあります。rend() というラベルが付いています。ベクトル内の最初の要素には数値 10 が含まれており、

解説

ranges::rend() は双方向のすべての範囲で機能しますが、 std::rend() は機能しない場合があります。

// requires /std:c++20 or later
#include <vector>
#include <ranges>
#include <iostream>

int main()
{
    std::vector v{10, 20, 30};
    auto vi = std::ranges::rend(v);
    --vi; // get off the sentinel and onto the last element in the reversed range
    std::cout << *vi; // outputs 10
    std::cout << *vi << ' ' << *--vi << ' ' << *--vi; // outputs 10, 20, 30
}

size

範囲内の要素の数を符号なし値として取得します。

template<class T>
constexpr /*unsigned integer-like type */ size(T&& rg);

パラメーター

T
範囲の型。

rg
範囲。

戻り値

範囲内の要素の数を符号なし整数に似た値として指定します。

解説

この関数は一定の時間で実行されます。

// requires /std:c++20 or later
#include <vector>
#include <ranges>
#include <iostream>

int main()
{
    std::vector v{10, 20, 30};
    auto s = std::ranges::size(v); // s is a size_t
    std::cout << s; // outputs 3
}

ssize

範囲のサイズを符号付き値として取得します。

template<class T>
constexpr /* signed-integer-like type */ ssize(T&& rg);

パラメーター

T
範囲の型。

rg
範囲。

戻り値

範囲内の要素の数を、符号付き整数に似た値として指定します。

解説

この関数は一定の時間で実行されます。

// requires /std:c++20 or later
#include <vector>
#include <ranges>
#include <iostream>

int main()
{
    std::vector v{10, 20, 30};
    auto s = std::ranges::ssize(v);
    std::cout << s; // outputs 3
}

関連項目

<ranges>
カスタマイズ オブジェクトとは