<ranges>
関数
<ranges>
C++20 ヘッダーには、次の非メンバー ヘルパー関数が含まれています。
非メンバー関数 | 説明 |
---|---|
begin C++20 |
範囲内の最初の要素を指す反復子を取得します。 |
cbegin C++20 |
範囲内の最初の要素を指す const 反復子を取得します。 |
cend C++20 |
const 修飾範囲の末尾にある sentinel を取得します。 |
cdata C++20 |
連続した範囲内の最初の要素への const ポインターを取得します。 |
crbegin C++20 |
範囲の先頭を指す反転 const 反復子を取得します。 |
crend C++20 |
crbegin() が返す内容の最後にセンチネルを取得します。 |
data C++20 |
連続する範囲内の最初の要素へのポインターを取得します。 |
empty C++20 |
範囲が空かどうかをテストします。 |
end C++20 |
範囲の末尾にあるセンチネルを取得します。 |
rbegin C++20 |
範囲の先頭を指す逆反復子を取得します。 |
rend C++20 |
範囲の末尾にあるセンチネルを指す逆反復子を取得します。 |
size C++20 |
範囲のサイズを符号なし値として取得します。 |
ssize C++20 |
範囲のサイズを符号付き値として取得します。 |
これらの関数の多くは、 カスタマイズ ポイント オブジェクトとして実装されています。 カスタマイズ ポイント オブジェクトはユーザー定義型でオーバーロードできる関数オブジェクトですが、関数オブジェクトに渡すことができる型に対する制約も適用されます。 その結果、コンパイラは、渡された型を呼び出す有効なカスタマイズされた関数があるかどうか、または既定の実装を使用する必要があるかどうか、または呼び出しの形式が正しくないかどうかを判断します。
これらの関数の多くは、 std
名前空間に対応する関数を持っています。 ただし、範囲を操作する場合は、代わりにこれらのヘルパー関数を使用してください。 これらの関数では C++20 の概念が使用されるため、コンパイル時エラーが向上します。 これらはカスタマイズ ポイントとして実装されているため、引数依存参照 (ADL) と const の正確性に関連する問題は回避されます。
begin
範囲内の最初の要素を指す反復子を取得します。
template<class T>
constexpr std::input_or_output_iterator auto begin(T&& rg);
パラメーター
T
範囲の型。
rg
範囲。
戻り値
範囲内の最初の要素を指す反復子:
範囲が配列の場合は、 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
反復子。
範囲が配列の場合は、 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:
解説
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
反復子。 この反復子は、範囲の末尾から、範囲の要素を逆の順序で返します。
範囲が配列の場合は、配列内の要素の数n
reverse_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 は、範囲の反転ビューの最後の要素に従います。
解説
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
範囲。
戻り値
範囲内の最後の要素に続くセンチネル:
解説
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
範囲。
戻り値
範囲内の最初の要素を指す逆反復子。 この反復子は、反転された範囲の末尾から、範囲の要素を逆順に返します。
範囲が配列の場合は、配列内の要素の数n
reverse_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 は、範囲の反転ビューの最後の要素に従います。
解説
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
}