Udostępnij za pośrednictwem


<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
beginC++20 Pobierz iterator do pierwszego elementu w zakresie.
cbeginC++20 const Pobierz iterator do pierwszego elementu w zakresie.
cendC++20 Pobierz sentinel na końcu -kwalifikowanego constzakresu.
cdataC++20 const Pobierz wskaźnik do pierwszego elementu w ciągłym zakresie.
crbeginC++20 Pobierz iterator odwrotny const na początek zakresu.
crendC++20 Pobierz sentinel na końcu zwracanych crbegin() wartości.
dataC++20 Pobierz wskaźnik do pierwszego elementu w ciągłym zakresie.
emptyC++20 Przetestuj, czy zakres jest pusty.
endC++20 Pobierz sentinel na końcu zakresu.
rbeginC++20 Pobierz iterator odwrotny na początek zakresu.
rendC++20 Pobierz iterator odwrotny do sentinel na końcu zakresu.
sizeC++20 Pobierz rozmiar zakresu jako wartość niepodpisaną.
ssizeC++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:

Obraz wektora z elementami 10, 20 i 30. Pierwszy element zawiera wartość 10 i ma etykietę

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:

Obraz wektora z elementami 10, 20 i 30. Pierwszy element zawiera wartość 10 i ma etykietę

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 constzakresu. 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 constw -kwalifikowanym zakresie:

Obraz wektora z elementami 10, 20 i 30. Pierwszy element zawiera wartość 10 i ma etykietę cbegin(). Ostatni element zawiera wartość 30 i ma etykietę

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:

Obraz wektora zawierającego elementy 10, 20 i 30. Istnieje wyimaginowane pole przed najbardziej lewym elementem (lewy element zawiera liczbę 10), która reprezentuje sentinel. Ma on etykietę crend(). Pierwszy element w wektorze zawiera liczbę 10 i ma etykietę

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:

Obraz wektora zawierającego elementy 10, 20 i 30. Istnieje wyimaginowane pole przed najbardziej lewym elementem (lewy element zawiera liczbę 10), która reprezentuje sentinel. Ma on etykietę crend(). Pierwszy element w wektorze zawiera liczbę 10 i ma etykietę

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:

Obraz wektora z elementami 10, 20 i 30. Pierwszy element zawiera wartość 10 i ma etykietę begin(). Ostatni element zawiera wartość 30 i ma etykietę

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:

Obraz wektora zawierającego elementy 10, 20 i 30. Istnieje wyimaginowane pole przed najbardziej lewym elementem (lewy element zawiera liczbę 10), która reprezentuje sentinel. Ma ona etykietę rend(). Pierwszy element w wektorze zawiera liczbę 10 i ma etykietę

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:

Obraz wektora zawierającego elementy 10, 20 i 30. Istnieje wyimaginowane pole przed najbardziej lewym elementem (lewy element zawiera liczbę 10), która reprezentuje sentinel. Ma ona etykietę rend(). Pierwszy element w wektorze zawiera liczbę 10 i ma etykietę

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
}

Zobacz też

<ranges>
Co to są obiekty dostosowywania