std::ranges::views::split, std::ranges::split_view
Определён в заголовочном файле <ranges> | ||
|---|---|---|
template< ranges::forward_range V, ranges::forward_range Pattern >
requires ranges::view<V> &&
ranges::view<Pattern> &&
std::indirectly_comparable<ranges::iterator_t<V>,
ranges::iterator_t<Pattern>,
ranges::equal_to>
class split_view
: public ranges::view_interface<split_view<V, Pattern>>
| (1) | (начиная с C++20) |
namespace views {
inline constexpr /* unspecified */ split = /* unspecified */;
}
| (2) | (начиная с C++20) |
| Сигнатура вызова | ||
template< ranges::viewable_range R, class Pattern >
requires /* see below */
constexpr ranges::view auto split( R&& r, Pattern&& pattern );
| (начиная с C++20) | |
template< class Pattern > constexpr /* range adaptor closure */ split( Pattern&& pattern ); | (начиная с C++20) |
views::split(e, p) эквивалентно по выражению split_view(e, p) для любых подходящих подвыражений e и p.split_view удовлетворяет концепциям forward_range и common_range, если лежащий в основе view V удовлетворяет соответствующим концепциям.
Внутренний диапазон (ranges::range_reference_t<split_view>) — это ranges::subrange<ranges::iterator_t<V>>, который удовлетворяет концепции common_range, концепции sized_range, если ranges::iterator_t<V> удовлетворяет std::sized_sentinel_for<ranges::iterator_t<V>>, и концепциям contiguous_range, random_access_range, bidirectional_range и forward_range, если V удовлетворяет соответствующим концепциям.
В отличие от lazy_split_view, split_view сохраняет непрерывность поддиапазона, что делает его подходящим для разделения строк.
Поля данных
| Член | Описание |
|---|---|
V base_ (закрытый) | лежащий в основе (адаптированный) view(объект-член, используемый только для описания*) |
Pattern pattern_ (закрытый) | объект-шаблон, используемый в качестве разделителя для разбиения лежащего в основе view(объект-член, используемый только для описания*) |
non-propagating-cache<ranges::subrange<ranges::iterator_t<V>>> cached_begin_ (закрытый) | объект, кэширующий результат первого вызова begin()(объект-член, используемый только для описания*) |
Функции-члены
создаёт split_view (открытая функция-член) |
|
| возвращает копию лежащего в основе (адаптированного) представления (открытая функция-член) |
|
| возвращает итератор на начало (открытая функция-член) |
|
| возвращает итератор или сентинел на конец (открытая функция-член) |
|
| выполняет поиск следующего вхождения шаблона (функция-член, используемая только для описания*) |
|
Унаследовано от |
|
возвращает, является ли производное представление пустым; предоставляется только в том случае, если оно удовлетворяет sized_range или forward_range (открытая функция-член std::ranges::view_interface<D>) |
|
|
(C++23) | возвращает константный итератор на начало диапазона (открытая функция-член std::ranges::view_interface<D>) |
|
(C++23) | возвращает сентинел для константного итератора диапазона (открытая функция-член std::ranges::view_interface<D>) |
возвращает, является ли производное представление непустым; предоставляется только в том случае, если к нему применима ranges::empty (открытая функция-член std::ranges::view_interface<D>) |
|
возвращает первый элемент производного представления; предоставляется, если оно удовлетворяет forward_range (открытая функция-член std::ranges::view_interface<D>) |
|
Вложенные классы
| тип итератора (класс-член, используемый только для описания*) |
|
| тип сентинела (класс-член, используемый только для описания*) |
Руководства по выводу типов
Примечания
До выхода P2210R2 в split_view для разбиения использовался ленивый механизм, поэтому не удавалось сохранить свойства двунаправленного, произвольного доступа или непрерывного диапазона, присущие лежащему в основе представлению, а также обеспечить совпадение типа итератора внутреннего диапазона с типом итератора лежащего в основе представления. В результате в P2210R2 он был переработан, а ленивый механизм перенесён в lazy_split_view.
В качестве разделителя pattern обычно не следует использовать обычный строковый литерал, поскольку завершающий нулевой символ будет считаться обязательной частью разделителя; поэтому вместо него рекомендуется использовать литерал std::string_view.
Пример
#include <iomanip>
#include <iostream>
#include <ranges>
#include <string_view>
int main()
{
using std::operator""sv;
constexpr auto words{"Hello^_^C++^_^20^_^!"sv};
constexpr auto delim{"^_^"sv};
for (const auto word : std::views::split(words, delim))
// with string_view's C++23 range constructor:
std::cout << std::quoted(std::string_view(word)) << ' ';
std::cout << '\n';
}
Вывод:
"Hello" "C++" "20" "!"
Отчёты об ошибках
Следующие отчёты об ошибках, изменяющие поведение, были применены задним числом к ранее опубликованным стандартам C++.
| DR | Применяется к | Опубликованное поведение | Корректное поведение |
|---|---|---|---|
| P2210R2 | C++20 | старая версия split_view была слишком ленивой для удобного использования | она переработана |
См. также
|
(C++20) | view над поддиапазонами, полученными при разделении другого view с помощью разделителя(шаблон класса) (объект-адаптер диапазона) |
|
(C++20) | view, состоящее из последовательности, полученной при объединении view из rangeов(шаблон класса) (объект-адаптер диапазона) |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/ranges/split_view