<ranges>
, funkcje
Nagłówek <ranges>
języka C++20 zawiera następujące funkcje pomocnicze inne niż składowe.
Funkcje inne niż składowe | Opis |
---|---|
begin C++20 |
Pobierz iterator do pierwszego elementu w zakresie. |
cbegin C++20 |
const Pobierz iterator do pierwszego elementu w zakresie. |
cend C++20 |
Pobierz sentinel na końcu -kwalifikowanego const zakresu. |
cdata C++20 |
const Pobierz wskaźnik do pierwszego elementu w ciągłym zakresie. |
crbegin C++20 |
Pobierz iterator odwrotny const na początek zakresu. |
crend C++20 |
Pobierz sentinel na końcu zwracanych crbegin() wartości. |
data C++20 |
Pobierz wskaźnik do pierwszego elementu w ciągłym zakresie. |
empty C++20 |
Przetestuj, czy zakres jest pusty. |
end C++20 |
Pobierz sentinel na końcu zakresu. |
rbegin C++20 |
Pobierz iterator odwrotny na początek zakresu. |
rend C++20 |
Pobierz iterator odwrotny do sentinel na końcu zakresu. |
size C++20 |
Pobierz rozmiar zakresu jako wartość niepodpisaną. |
ssize C++20 |
Pobierz rozmiar zakresu jako wartość ze znakiem. |
Wiele z tych "funkcji" jest implementowanych jako obiekty punktu dostosowywania. Obiekt punktu dostosowywania jest obiektem funkcji, który może być przeciążony na typach zdefiniowanych przez użytkownika, jednocześnie wymuszając ograniczenia dotyczące typów, które mogą być przekazywane do obiektu funkcji. Efekt netto polega na tym, że kompilator oblicza, czy istnieje prawidłowa niestandardowa funkcja do wywołania przekazanego typu lub jeśli należy użyć domyślnej implementacji, lub jeśli wywołanie jest źle sformułowane.
Wiele z tych funkcji ma odpowiednie funkcje w std
przestrzeni nazw. Jednak podczas pracy z zakresami użyj tych funkcji pomocnika. Te funkcje korzystają z koncepcji języka C++20, które zapewniają lepsze błędy czasu kompilacji. Ponieważ są one implementowane jako punkty dostosowywania, unika się problemów związanych z wyszukiwaniem zależnym od argumentów (ADL) i poprawnością const.
begin
Pobierz iterator do pierwszego elementu w zakresie.
template<class T>
constexpr std::input_or_output_iterator auto begin(T&& rg);
Parametry
T
Typ zakresu.
rg
Zakres.
Wartość zwracana
Iterator pierwszego elementu w zakresie:
Jeśli zakres jest tablicą, zwraca odpowiednik elementu rg + 0
.
Jeśli auto(rg.begin())
zwraca iterator, zwraca odpowiednik elementu auto(rg.begin())
. Jeśli to wyrażenie jest źle sformułowane, jest używane, auto(begin(rg))
jeśli to wyrażenie zwraca iterator.
Uwagi
ranges::begin()
działa na wszystkich zakresach, podczas gdy std::begin()
może nie.
Przykład: 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
Pobierz iterator do pierwszego elementu w zakresie.
Iterator może uzyskać dostęp do elementów w zakresie, ale nie może ich modyfikować.
template<class T>
constexpr std::input_or_output_iterator auto cbegin(T&& rg);
Parametry
T
Typ zakresu.
rg
Zakres.
Wartość zwracana
const
Iterator pierwszego elementu w zakresie:
Jeśli zakres jest tablicą, zwraca odpowiednik elementu rg + 0
.
Jeśli auto(rg.cbegin())
zwraca iterator, zwraca odpowiednik elementu auto(rg.cbegin())
. Jeśli to wyrażenie jest źle sformułowane, jest używane, auto(cbegin(rg))
jeśli to wyrażenie zwraca iterator.
Uwagi
ranges::cbegin()
działa na wszystkich zakresach, podczas gdy std::cbegin()
może nie.
Przykład: 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
Pobierz wskaźnik do pierwszego elementu w ciągłym zakresie.
template<class T>
constexpr std::add_pointer_t<ranges::range_reference_t<const T>> cdata(T&& rg);
Parametry
T
Typ zakresu.
rg
Zakres.
Wartość zwracana
Wskaźnik const
oparty na typie zakresu do pierwszych danych elementu w ciągłym zakresie. Jeśli na przykład zakres jest wektorem liczb całkowitych, typ wartości zwracanej to const int *
.
Przykład: 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
Pobierz sentinel na końcu -kwalifikowanego const
zakresu.
Iterator może uzyskać dostęp do elementów w zakresie, ale nie może ich modyfikować.
template<class T>
constexpr std::sentinel_for<decltype(ranges::cbegin(std::declval<T>()))> auto cend(T&& rg);
Parametry
T
Typ zakresu.
rg
Zakres.
Wartość zwracana
Sentinel, który jest zgodny z ostatnim elementem const
w -kwalifikowanym zakresie:
Uwagi
ranges::cend()
działa na wszystkich zakresach, podczas gdy std::cend()
może nie.
Przykład: 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
Pobierz iterator odwrotny const
do pierwszego elementu w odwróconym zakresie.
Iterator odwrotny zwraca elementy zakresu w odwrotnej kolejności.
Sam zakres nie jest odwrócony; dostęp do niego.
template<class T>
constexpr std::input_or_output_iterator auto crbegin(T&& rg);
Parametry
T
Typ zakresu.
rg
Zakres.
Wartość zwracana
Iterator odwrotny const
do pierwszego elementu w zakresie. Ten iterator zwraca elementy zakresu w odwrotnej kolejności, zaczynając od końca zakresu:
Jeśli zakres jest tablicą, zwraca odpowiednik reverse_iterator{rg + n}
, gdzie n
jest liczbą elementów w tablicy.
Jeśli auto(rg.crbegin())
zwraca iterator, zwraca odpowiednik elementu auto(rg.crbegin())
. Jeśli to wyrażenie jest źle sformułowane, jest używane, auto(crbegin(rg))
jeśli to wyrażenie zwraca iterator.
Uwagi
ranges::crbegin()
działa we wszystkich zakresach dwukierunkowych, podczas gdy std::crbegin()
nie.
Przykład: 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
Pobierz sentinel na końcu zwracanych crbegin()
wartości.
Iterator odwrotny zwraca elementy zakresu w odwrotnej kolejności.
Sam zakres nie jest odwrócony; dostęp do niego.
template<class T>
std::sentinel_for<decltype(ranges::crbegin(declval<T>()))> auto crend(T&& rg);
Parametry
T
Typ zakresu.
rg
Zakres.
Wartość zwracana
Sentinel na końcu tego, co cbegin()
zwraca. Sentinel jest zgodny z ostatnim elementem w odwróconym widoku zakresu:
Uwagi
ranges::crend()
działa we wszystkich zakresach dwukierunkowych, podczas gdy std::crend()
nie.
crend
przykład
// 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
Pobierz wskaźnik do pierwszego elementu w ciągłym zakresie.
template<class T>
constexpr std::add_pointer_t<ranges::range_reference_t<T>> data(T&& rg);
Parametry
T
Typ zakresu.
rg
Zakres.
Wartość zwracana
Wskaźnik oparty na typie zakresu do pierwszego elementu w ciągłym zakresie. Jeśli na przykład zakres jest wektorem liczb całkowitych, typ wartości zwracanej to int *
.
Przykład
// 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
Przetestuj, czy zakres jest pusty.
template<class T>
constexpr bool empty(T&& rg);
Parametry
T
Typ zakresu.
rg
Zakres.
Wartość zwracana
Zwraca true
wartość , jeśli zakres nie zawiera żadnych elementów; w przeciwnym razie false
.
Przykład
// 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
Pobierz sentinel na końcu zakresu.
template<class T>
std::sentinel_for<ranges::iterator_t<T>> auto end(T&& rg);
Parametry
T
Typ zakresu.
rg
Zakres.
Wartość zwracana
Sentinel, który jest zgodny z ostatnim elementem w zakresie:
Uwagi
ranges::end()
działa na wszystkich zakresach, podczas gdy std::end()
może nie.
Przykład
// 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
Pobierz iterator odwrotny do pierwszego elementu w odwróconym zakresie. Iterator odwrotny zwraca elementy zakresu w odwrotnej kolejności. Sam zakres nie jest odwrócony; dostęp do niego.
template<class T>
constexpr std::input_or_output_iterator auto rbegin(T&& rg);
Parametry
T
Typ zakresu.
rg
Zakres.
Wartość zwracana
Iterator odwrotny do pierwszego elementu w zakresie. Ten iterator zwraca elementy zakresu w odwrotnej kolejności, począwszy od końca odwróconego zakresu:
Jeśli zakres jest tablicą, zwraca odpowiednik reverse_iterator{rg + n}
, gdzie n
jest liczbą elementów w tablicy.
Jeśli auto(rg.rbegin())
zwraca iterator, zwraca odpowiednik elementu auto(rg.rbegin())
. Jeśli to wyrażenie jest źle sformułowane, jest używane, auto(rbegin(rg))
jeśli to wyrażenie zwraca iterator.
Uwagi
ranges::rbegin()
działa we wszystkich zakresach dwukierunkowych, podczas gdy std::rbegin()
nie.
Przykład
// 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
Pobierz iterator odwrotny do sentinel na końcu odwróconego widoku zakresu. Iterator odwrotny zwraca elementy zakresu w odwrotnej kolejności. Sam zakres nie jest odwrócony; dostęp do niego.
template<class T>
constexpr
std::sentinel_for<decltype(ranges::rbegin(std::declval<T>()))> auto rend(T&& rg);
Parametry
T
Typ zakresu.
rg
Zakres.
Wartość zwracana
Iterator odwrotny do sentinel na końcu zakresu. Sentinel jest zgodny z ostatnim elementem w odwróconym widoku zakresu:
Uwagi
ranges::rend()
działa we wszystkich zakresach dwukierunkowych, podczas gdy std::rend()
nie.
Przykład
// 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
Pobierz liczbę elementów w zakresie jako niepodpisaną wartość.
template<class T>
constexpr /*unsigned integer-like type */ size(T&& rg);
Parametry
T
Typ zakresu.
rg
Zakres.
Wartość zwracana
Liczba elementów w zakresie jako wartość niepodpisanej liczby całkowitej.
Uwagi
Ta funkcja jest wykonywana w stałym czasie.
Przykład
// 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
Pobierz rozmiar zakresu jako wartość ze znakiem.
template<class T>
constexpr /* signed-integer-like type */ ssize(T&& rg);
Parametry
T
Typ zakresu.
rg
Zakres.
Wartość zwracana
Liczba elementów w zakresie jako wartość typu liczba całkowita ze znakiem.
Uwagi
Ta funkcja jest wykonywana w stałym czasie.
Przykład
// 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
}