Spec-Zone.ru › C++

std::ranges::views::repeat, std::ranges::repeat_view

Определено в заголовочном файле <ranges>
template< std::move_constructible W,
          std::semiregular Bound = std::unreachable_sentinel_t >
    requires (std::is_object_v<W> && std::same_as<W, std::remove_cv_t<W>> &&
             (/*is-integer-like*/<Bound> ||
              std::same_as<Bound, std::unreachable_sentinel_t>))
class repeat_view : public ranges::view_interface<repeat_view<W, Bound>>
(1) (с C++23)
namespace views {
    inline constexpr /*unspecified*/ repeat = /*unspecified*/;
}
(2) (с C++23)
Подпись вызова
template< class W >
    requires /* see below */
constexpr /* see below */ repeat( W&& value );
(с C++23)
template< class W, class Bound >
    requires /* see below */
constexpr /* see below */ repeat( W&& value, Bound&& bound );
(с C++23)
1) Фабрика диапазонов, генерирующая последовательность элементов путём многократного воспроизведения одного и того же значения. Может быть ограниченной или неограниченной (бесконечной).
2) views::repeat(e) и views::repeat(e, f) эквивалентны с точки зрения выражений (имеют тот же эффект, что и) repeat_view(e) и repeat_view(e, f) соответственно для любых подходящих подвыражений e и f.

Объекты точек кастомизации

Имя views::repeat обозначает объект точки кастомизации, который является константным объектом-функцией литерального semiregular типа класса. Для наглядности, неквалифицированная версия его типа обозначается как __repeat_fn.

Все экземпляры __repeat_fn равны. Эффекты вызова разных экземпляров типа __repeat_fn с одними и теми же аргументами эквивалентны, независимо от того, является ли выражение, обозначающее экземпляр, lvalue или rvalue, и квалифицирован ли он как const (однако, экземпляр с квалификатором volatile не обязан быть вызываемым). Таким образом, views::repeat может быть свободно скопирован, а его копии могут быть использованы взаимозаменяемо.

Учитывая набор типов Args..., если std::declval<Args>()... удовлетворяют требованиям аргументов к views::repeat выше, __repeat_fn моделирует

  • std::invocable<__repeat_fn, Args...>,
  • std::invocable<const __repeat_fn, Args...>,
  • std::invocable<__repeat_fn&, Args...>, и
  • std::invocable<const __repeat_fn&, Args...>.

В противном случае, ни один оператор вызова функции __repeat_fn не участвует в разрешении перегрузки.

Члены данных

Название члена Определение
value_ (private) Начальное значение оборачиваемого типа movable-box<W>.
(экспозиционный-только член-объект*)
bound_ (private) Значение сторожевого элемента типа Bound.
(экспозиционный-только член-объект*)

Члены-функции

(конструктор)
создаёт repeat_view
(публичная функция-член)
begin
получает итератор начала диапазона repeat_view
(публичная функция-член)
end
получает сторожевой элемент, обозначающий конец диапазона repeat_view
(публичная функция-член)
size
получает размер диапазона repeat_view, если он размеченный
(публичная функция-член)
Наследуется от std::ranges::view_interface
empty
(C++20)
возвращает, пуст ли производный диапазон. Предоставляется, если он удовлетворяет sized_range или forward_range.
(публичная функция-член std::ranges::view_interface<D>)
cbegin
(C++23)
возвращает константный итератор начала диапазона.
(публичная функция-член std::ranges::view_interface<D>)
cend
(C++23)
возвращает сторожевой элемент для константного итератора диапазона.
(публичная функция-член std::ranges::view_interface<D>)
operator bool
(C++20)
возвращает, не пуст ли производный диапазон. Предоставляется, если ranges::empty применимо к нему.
(публичная функция-член std::ranges::view_interface<D>)
front
(C++20)
возвращает первый элемент в производном диапазоне. Предоставляется, если он удовлетворяет forward_range.
(публичная функция-член std::ranges::view_interface<D>)
back
(C++20)
возвращает последний элемент в производном диапазоне. Предоставляется, если он удовлетворяет bidirectional_range и common_range.
(публичная функция-член std::ranges::view_interface<D>)
operator[]
(C++20)
возвращает n-й элемент в производном диапазоне. Предоставляется, если он удовлетворяет random_access_range.
(публичная функция-член std::ranges::view_interface<D>)

std::ranges::repeat_view::repeat_view

repeat_view() requires std::default_initializable<W> = default;
(1) (с C++23)
constexpr explicit repeat_view( const W& value, Bound bound = Bound() );
(2) (с C++23)
constexpr explicit repeat_view( W&& value, Bound bound = Bound() );
(3) (с C++23)
template < class... WArgs, class... BoundArgs >
    requires std::constructible_from<W, WArgs...>
          && std::constructible_from<Bound, BoundArgs...>
constexpr explicit repeat( std::piecewise_construct_t,
                           std::tuple<WArgs...> value_args,
                           std::tuple<BoundArgs...> bound_args = std::tuple<>{} );
(4) (с C++23)
1) Значения value_ и bound_ инициализируются с помощью их инициализаторов по умолчанию (= W() и = Bound()).
2) value_ инициализируется значением value, а bound_ - значением bound . Поведение не определено, если Bound не является std::unreachable_sentinel_t, а bool(bound >= 0) - false.
3) value_ инициализируется значением std::move(value), а bound_ - значением bound . Поведение не определено, если Bound не является std::unreachable_sentinel_t, а bool(bound >= 0) - false.
4) value_ и bound_ инициализируются с помощью кусочной инициализации.

Параметры

value - значение, которое будет многократно воспроизводиться
bound - граница

std::ranges::repeat_view::begin

constexpr /*iterator*/ begin() const;
(с C++23)

Возвращает итератор, инициализированный std::addressof(*value_).

END_OF_DOCUMENT_MARKER

std::ranges::repeat_view::end

constexpr /*iterator*/ end() const
    requires (!std::same_as<Bound, std::unreachable_sentinel_t>);
(1) (since C++23)
constexpr std::unreachable_sentinel_t end() const;
(2) (since C++23)
1) Возвращает итератор, инициализированный std::addressof(*value_) и bound_.
2) Возвращает std::unreachable_sentinel.

std::ranges::repeat_view::size

constexpr auto size() const
    requires (!std::same_as<Bound, std::unreachable_sentinel_t>);
(since C++23)

Возвращает размер представления, если представление ограничено. Эквивалентно return /*to-unsigned-like*/(bound_);.

Шаблон функции только для демонстрации to-unsigned-like преобразует свой аргумент (который должен быть целочисленного типа) в соответствующую беззнаковую версию типа аргумента.

Правила вывода типов

template< class W, class Bound >
repeat_view( W, Bound ) -> repeat_view<W, Bound>;
(since C++23)

Вложенные классы

iterator
(C++23)
тип итератора
(член класса только для демонстрации*)

Примечания

Если Bound не std::unreachable_sentinel_t, то repeat_view моделирует sized_range и common_range.

Макросы проверки наличия функций Значение Std Функция
__cpp_lib_ranges_repeat 202207L (C++23) std::ranges::repeat_view

Пример

#include <iostream>
#include <ranges>
#include <string_view>
using namespace std::literals;
 
int main()
{
    // bounded overload
    for (auto s : std::views::repeat("C++"sv, 3))
        std::cout << s << ' ';
    std::cout << '\n';
 
    // unbounded overload
    for (auto s : std::views::repeat("I know that you know that"sv)
                | std::views::take(3))
        std::cout << s << ' ';
    std::cout << "...\n";
}

Вывод:

C++ C++ C++
I know that you know that I know that you know that I know that you know that ...

См. также

ranges::iota_viewviews::iota
(C++20)
представление, состоящее из последовательности, генерируемой повторным инкрементированием начального значения
(шаблон класса) (объект точек настройки)

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/cpp/ranges/repeat_view

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API