std::ranges::views::zip, std::ranges::zip_view
Определён в заголовочном файле <ranges> | ||
|---|---|---|
template< ranges::input_range... Views >
requires (ranges::view<Views> && ...) && (sizeof...(Views) > 0)
class zip_view
: public ranges::view_interface<zip_view<Views...>>
| (1) | (начиная с C++23) |
namespace views {
inline constexpr /*unspecified*/ zip = /*unspecified*/;
}
| (2) | (начиная с C++23) |
| Сигнатура вызова | ||
template< ranges::viewable_range... Rs >
requires /* see below */
constexpr ranges::view auto zip( Rs&&... rs );
| (начиная с C++23) |
zip_view — это адаптер диапазонов, который принимает одно или несколько views и создаёт view, iй элемент которого — значение, подобное кортежу и состоящее из i-х элементов всех представлений. Размер созданного представления равен наименьшему размеру среди всех адаптированных представлений.views::zip — это объект-точка настройки.При вызове без аргументов views::zip() эквивалентно выражению auto(views::empty<std::tuple<>>).
В противном случае views::zip(rs...) эквивалентно выражению ranges::zip_view<views::all_t<decltype((rs))>...>(rs...).
zip_view всегда моделирует input_range и моделирует forward_range, bidirectional_range, random_access_range или sized_range, если типы всех адаптированных view моделируют соответствующее понятие.
zip_view моделирует common_range, если
-
sizeof...(Views)равен1, и единственный тип адаптированного представления моделируетcommon_range, или - по крайней мере один тип адаптированного представления не моделирует
bidirectional_range, а каждый тип адаптированного представления моделируетcommon_range, или - каждый тип адаптированного представления моделирует и
random_access_range, иsized_range.
Объекты-точки настройки
Имя views::zip обозначает объект-точку настройки — константный функциональный объект литерального типа класса, являющегося литеральным semiregular. Подробности см. в разделе Объект-точка настройки.
Члены-данные
| Член | Описание |
|---|---|
std::tuple<Views...> views_ | все адаптированные объекты-представления (член-объект, предназначенный только для экспозиции*) |
Функции-члены
создаёт zip_view (открытая функция-член) |
|
| возвращает итератор на начало (открытая функция-член) |
|
| возвращает итератор или sentinel на конец (открытая функция-член) |
|
возвращает количество элементов; доступна, только если каждый базовый (адаптированный) диапазон удовлетворяет понятию sized_range (открытая функция-член) |
|
Унаследовано от |
|
возвращает значение, указывающее, пусто ли производное представление; доступна, только если оно удовлетворяет понятию sized_range или forward_range (открытая функция-член класса std::ranges::view_interface<D>) |
|
|
(C++23) | возвращает константный итератор на начало диапазона (открытая функция-член класса std::ranges::view_interface<D>) |
|
(C++23) | возвращает sentinel для константного итератора диапазона (открытая функция-член класса std::ranges::view_interface<D>) |
возвращает значение, указывающее, не пусто ли производное представление; доступна, только если к нему применимо ranges::empty (открытая функция-член класса std::ranges::view_interface<D>) |
|
возвращает первый элемент производного представления; доступна, если оно удовлетворяет понятию forward_range (открытая функция-член класса std::ranges::view_interface<D>) |
|
возвращает последний элемент производного представления; доступна, только если оно удовлетворяет понятиям bidirectional_range и common_range (открытая функция-член класса std::ranges::view_interface<D>) |
|
возвращает n-й элемент производного представления; доступна, только если оно удовлетворяет понятию random_access_range (открытая функция-член класса std::ranges::view_interface<D>) |
|
Руководства по выводу типов
Вложенные классы
| тип итератора (шаблон класса-члена, предназначенный только для экспозиции*) |
|
тип sentinel, используемый, когда zip_view не является common_range(шаблон класса-члена, предназначенный только для экспозиции*) |
Вспомогательные шаблоны
template< class... Views >
constexpr bool enable_borrowed_range<ranges::zip_view<Views...>> =
(ranges::enable_borrowed_range<Views> && ...);
| (начиная с C++23) |
Эта специализация ranges::enable_borrowed_range позволяет zip_view удовлетворять понятию borrowed_range, если ему удовлетворяет каждое базовое представление.
Примечания
| Макрос проверки поддержки возможностей | Значение | Стандарт | Возможность |
|---|---|---|---|
__cpp_lib_ranges_zip | 202110L | (C++23) |
ranges::zip_view,ranges::zip_transform_view, ranges::adjacent_view, ranges::adjacent_transform_view |
Пример
#include <array>
#include <iostream>
#include <list>
#include <ranges>
#include <string>
#include <tuple>
#include <vector>
void print(auto const rem, auto const& range)
{
for (std::cout << rem; auto const& elem : range)
std::cout << elem << ' ';
std::cout << '\n';
}
int main()
{
auto x = std::vector{1, 2, 3, 4};
auto y = std::list<std::string>{"α", "β", "γ", "δ", "ε"};
auto z = std::array{'A', 'B', 'C', 'D', 'E', 'F'};
print("Source views:", "");
print("x: ", x);
print("y: ", y);
print("z: ", z);
print("\nzip(x,y,z):", "");
for (std::tuple<int&, std::string&, char&> elem : std::views::zip(x, y, z))
{
std::cout << std::get<0>(elem) << ' '
<< std::get<1>(elem) << ' '
<< std::get<2>(elem) << '\n';
std::get<char&>(elem) += ('a' - 'A'); // modifies the element of z
}
print("\nAfter modification, z: ", z);
}
Вывод:
Source views: x: 1 2 3 4 y: α β γ δ ε z: A B C D E F zip(x,y,z): 1 α A 2 β B 3 γ C 4 δ D After modification, z: a b c d E F
См. также
|
(C++23) | view, состоящее из результатов применения функции преобразования к соответствующим элементам адаптированных представлений(шаблон класса) (объект-точка настройки) |
|
(C++20) | принимает view, состоящее из значений tuple-like, и число N, после чего создаёт view из N-х элементов каждого кортежа(шаблон класса) (объект-адаптер диапазона) |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/ranges/zip_view