<ranges>
-Funktionen
Der <ranges>
C++20-Header enthält die folgenden Nicht-Member-Hilfsfunktionen.
Nicht-Member-Funktionen | Beschreibung |
---|---|
begin C++20 |
Rufen Sie einen Iterator zum ersten Element im Bereich ab. |
cbegin C++20 |
Rufen Sie einen const Iterator zum ersten Element im Bereich ab. |
cend C++20 |
Rufen Sie den Sentinel am Ende des const qualifizierten Bereichs ab. |
cdata C++20 |
Rufen Sie einen const Zeiger auf das erste Element im zusammenhängenden Bereich ab. |
crbegin C++20 |
Rufen Sie einen umgekehrten const Iterator zum Anfang des Bereichs ab. |
crend C++20 |
Rufen Sie den Sentinel am Ende der crbegin() Rückgabe ab. |
data C++20 |
Rufen Sie einen Zeiger auf das erste Element im zusammenhängenden Bereich ab. |
empty C++20 |
Testen Sie, ob der Bereich leer ist. |
end C++20 |
Rufen Sie den Sentinel am Ende des Bereichs ab. |
rbegin C++20 |
Rufen Sie einen umgekehrten Iterator zum Anfang des Bereichs ab. |
rend C++20 |
Rufen Sie einen umgekehrten Iterator am Ende des Bereichs zum Sentinel ab. |
size C++20 |
Ruft die Größe des Bereichs als nicht signierten Wert ab. |
ssize C++20 |
Ruft die Größe des Bereichs als signierten Wert ab. |
Viele dieser Funktionen werden als Anpassungspunktobjekte implementiert. Ein Anpassungspunktobjekt ist ein Funktionsobjekt , das in benutzerdefinierten Typen überladen werden kann, und gleichzeitig Einschränkungen erzwingt, welche Typen an das Funktionsobjekt übergeben werden können. Der Nettoeffekt ist, dass der Compiler herausfindet, ob eine gültige angepasste Funktion zum Aufrufen des übergebenen Typs vorhanden ist oder wenn die Standardimplementierung verwendet werden soll oder wenn der Aufruf unformiert ist.
Viele dieser Funktionen verfügen über entsprechende Funktionen im std
Namespace. Verwenden Sie beim Arbeiten mit Bereichen stattdessen diese Hilfsfunktionen. Diese Funktionen verwenden C++20-Konzepte, die bessere Kompilierungszeitfehler bieten. Da sie als Anpassungspunkte implementiert werden, werden Probleme im Zusammenhang mit der argumentabhängigen Suche (ADL) und der Korrektheit vermieden.
begin
Rufen Sie einen Iterator zum ersten Element im Bereich ab.
template<class T>
constexpr std::input_or_output_iterator auto begin(T&& rg);
Parameter
T
Der Typ des Bereichs.
rg
Ein Bereich.
Rückgabewert
Ein Iterator für das erste Element im Bereich:
Wenn der Bereich ein Array ist, wird das Äquivalent von rg + 0
.
Wenn auto(rg.begin())
ein Iterator zurückgegeben wird, wird das Äquivalent von auto(rg.begin())
. Wenn dieser Ausdruck unformiert ist, wird verwendet, auto(begin(rg))
wenn dieser Ausdruck einen Iterator zurückgibt.
Hinweise
ranges::begin()
funktioniert auf allen Bereichen, aber std::begin()
nicht.
Beispiel: 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
Rufen Sie einen const
Iterator zum ersten Element in einem Bereich ab.
Der Iterator kann auf die Elemente im Bereich zugreifen, aber nicht ändern.
template<class T>
constexpr std::input_or_output_iterator auto cbegin(T&& rg);
Parameter
T
Der Typ des Bereichs.
rg
Ein Bereich.
Rückgabewert
Ein const
Iterator für das erste Element im Bereich:
Wenn der Bereich ein Array ist, wird das Äquivalent von rg + 0
.
Wenn auto(rg.cbegin())
ein Iterator zurückgegeben wird, wird das Äquivalent von auto(rg.cbegin())
. Wenn dieser Ausdruck unformiert ist, wird verwendet, auto(cbegin(rg))
wenn dieser Ausdruck einen Iterator zurückgibt.
Hinweise
ranges::cbegin()
funktioniert auf allen Bereichen, aber std::cbegin()
nicht.
Beispiel: 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
Rufen Sie einen const
Zeiger auf das erste Element im zusammenhängenden Bereich ab.
template<class T>
constexpr std::add_pointer_t<ranges::range_reference_t<const T>> cdata(T&& rg);
Parameter
T
Der Typ des Bereichs.
rg
Ein Bereich.
Rückgabewert
Ein const
Zeiger basierend auf dem Typ des Bereichs auf die ersten Elementdaten im zusammenhängenden Bereich. Wenn der Bereich z. B. ein Vektor ganzzahliger Zahlen ist, ist der Typ des Rückgabewerts ein const int *
.
Beispiel: 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
Rufen Sie den Sentinel am Ende des const
qualifizierten Bereichs ab.
Der Iterator kann auf die Elemente im Bereich zugreifen, aber nicht ändern.
template<class T>
constexpr std::sentinel_for<decltype(ranges::cbegin(std::declval<T>()))> auto cend(T&& rg);
Parameter
T
Der Typ des Bereichs.
rg
Ein Bereich.
Rückgabewert
Der Sentinel, der auf das letzte Element im const
-qualifizierten Bereich folgt:
Hinweise
ranges::cend()
funktioniert auf allen Bereichen, aber std::cend()
nicht.
Beispiel: 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
Rufen Sie einen umgekehrten const
Iterator zum ersten Element in einem umgekehrten Bereich ab.
Ein Umgekehrter Iterator gibt die Elemente des Bereichs in umgekehrter Reihenfolge zurück.
Der Bereich selbst wird nicht umgekehrt; Zugriff darauf ist.
template<class T>
constexpr std::input_or_output_iterator auto crbegin(T&& rg);
Parameter
T
Der Typ des Bereichs.
rg
Ein Bereich.
Rückgabewert
Ein Umgekehrter const
Iterator zum ersten Element im Bereich. Dieser Iterator gibt die Elemente des Bereichs in umgekehrter Reihenfolge zurück, beginnend am Ende des Bereichs:
Wenn der Bereich ein Array ist, wird das Äquivalent zurückgegeben reverse_iterator{rg + n}
, bei dem n
es sich um die Anzahl der Elemente im Array handelt.
Wenn auto(rg.crbegin())
ein Iterator zurückgegeben wird, wird das Äquivalent von auto(rg.crbegin())
. Wenn dieser Ausdruck unformiert ist, wird verwendet, auto(crbegin(rg))
wenn dieser Ausdruck einen Iterator zurückgibt.
Hinweise
ranges::crbegin()
funktioniert auf allen bidirektionalen Bereichen, aber std::crbegin()
nicht.
Beispiel: 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
Rufen Sie den Sentinel am Ende der crbegin()
Rückgabe ab.
Ein Umgekehrter Iterator gibt die Elemente des Bereichs in umgekehrter Reihenfolge zurück.
Der Bereich selbst wird nicht umgekehrt; Zugriff darauf ist.
template<class T>
std::sentinel_for<decltype(ranges::crbegin(declval<T>()))> auto crend(T&& rg);
Parameter
T
Der Typ des Bereichs.
rg
Ein Bereich.
Rückgabewert
Der Sentinel am Ende der cbegin()
Rückgabe. Der Sentinel folgt dem letzten Element in einer umgekehrten Ansicht des Bereichs:
Hinweise
ranges::crend()
funktioniert auf allen bidirektionalen Bereichen, aber std::crend()
nicht.
crend
-Beispiel
// 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
Rufen Sie einen Zeiger auf das erste Element in einem zusammenhängenden Bereich ab.
template<class T>
constexpr std::add_pointer_t<ranges::range_reference_t<T>> data(T&& rg);
Parameter
T
Der Typ des Bereichs.
rg
Ein Bereich.
Rückgabewert
Ein Zeiger basierend auf dem Typ des Bereichs auf das erste Element im zusammenhängenden Bereich. Wenn der Bereich beispielsweise ein Vektor ganzzahliger Zahlen ist, ist der Typ des Rückgabewerts ein int *
.
Beispiel
// 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
Testen Sie, ob der Bereich leer ist.
template<class T>
constexpr bool empty(T&& rg);
Parameter
T
Der Typ des Bereichs.
rg
Ein Bereich.
Rückgabewert
Gibt zurück true
, wenn der Bereich keine Elemente enthält; andernfalls false
.
Beispiel
// 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
Rufen Sie den Sentinel am Ende des Bereichs ab.
template<class T>
std::sentinel_for<ranges::iterator_t<T>> auto end(T&& rg);
Parameter
T
Der Typ des Bereichs.
rg
Ein Bereich.
Rückgabewert
Der Sentinel, der auf das letzte Element im Bereich folgt:
Hinweise
ranges::end()
funktioniert auf allen Bereichen, aber std::end()
nicht.
Beispiel
// 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
Rufen Sie einen umgekehrten Iterator zum ersten Element in einem umgekehrten Bereich ab. Ein Umgekehrter Iterator gibt die Elemente des Bereichs in umgekehrter Reihenfolge zurück. Der Bereich selbst wird nicht umgekehrt; Zugriff darauf ist.
template<class T>
constexpr std::input_or_output_iterator auto rbegin(T&& rg);
Parameter
T
Der Typ des Bereichs.
rg
Ein Bereich.
Rückgabewert
Ein Umgekehrter Iterator zum ersten Element im Bereich. Dieser Iterator gibt die Elemente des Bereichs in umgekehrter Reihenfolge zurück, beginnend am Ende des umgekehrten Bereichs:
Wenn der Bereich ein Array ist, wird das Äquivalent zurückgegeben reverse_iterator{rg + n}
, bei dem n
es sich um die Anzahl der Elemente im Array handelt.
Wenn auto(rg.rbegin())
ein Iterator zurückgegeben wird, wird das Äquivalent von auto(rg.rbegin())
. Wenn dieser Ausdruck unformiert ist, wird verwendet, auto(rbegin(rg))
wenn dieser Ausdruck einen Iterator zurückgibt.
Hinweise
ranges::rbegin()
funktioniert auf allen bidirektionalen Bereichen, aber std::rbegin()
nicht.
Beispiel
// 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
Rufen Sie am Ende einer umgekehrten Ansicht des Bereichs einen umgekehrten Iterator zum Sentinel ab. Ein Umgekehrter Iterator gibt die Elemente des Bereichs in umgekehrter Reihenfolge zurück. Der Bereich selbst wird nicht umgekehrt; Zugriff darauf ist.
template<class T>
constexpr
std::sentinel_for<decltype(ranges::rbegin(std::declval<T>()))> auto rend(T&& rg);
Parameter
T
Der Typ des Bereichs.
rg
Ein Bereich.
Rückgabewert
Ein umgekehrter Iterator zum Sentinel am Ende des Bereichs. Der Sentinel folgt dem letzten Element in einer umgekehrten Ansicht des Bereichs:
Hinweise
ranges::rend()
funktioniert auf allen bidirektionalen Bereichen, aber std::rend()
nicht.
Beispiel
// 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
Ruft die Anzahl der Elemente im Bereich als nicht signierten Wert ab.
template<class T>
constexpr /*unsigned integer-like type */ size(T&& rg);
Parameter
T
Der Typ des Bereichs.
rg
Ein Bereich.
Rückgabewert
Die Anzahl der Elemente im Bereich als nicht signierter ganzzahliger Wert.
Hinweise
Diese Funktion wird in konstanter Zeit ausgeführt.
Beispiel
// 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
Ruft die Größe des Bereichs als signierten Wert ab.
template<class T>
constexpr /* signed-integer-like type */ ssize(T&& rg);
Parameter
T
Der Typ des Bereichs.
rg
Ein Bereich.
Rückgabewert
Die Anzahl der Elemente im Bereich als signierter ganzzahliger Wert.
Hinweise
Diese Funktion wird in konstanter Zeit ausgeführt.
Beispiel
// 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
}