Daily bit(e) C++. std::views::zip
Добавлено 24 сентября 2026 в 05:30
Daily bit(e) C++ 116, zip-представление в C++23 – std::views::zip.

Представление std::views::zip из стандарта C++23 формирует последовательность элементов, подобных кортежам; каждый такой элемент состоит из соответствующих элементов всех исходных (адаптируемых) представлений.
Количество элементов в результирующем представлении определяется самым коротким из исходных диапазонов.
Элементы этого представления сохраняют семантику ссылок: это означает, что если исходные диапазоны допускают изменение (являются изменяемыми), то их элементы можно модифицировать через элементы данного представления.
#include <algorithm>
#include <vector>
#include <ranges>
std::vector<int> first{1,2,3,4,5};
std::vector<double> second{9,8,7,6};
// Пройтись по элементам zip-представления
for (auto [a, b] : std::views::zip(first, second))
{
// {1,9}, {2,8}, {3,7}, {4,6}
}
// То же, что и выше, но без структурированного связывания
for (std::tuple<int&,double&> el : std::views::zip(first, second))
{
// {1,9}, {2,8}, {3,7}, {4,6}
}
std::vector<std::string> third{"label1", "label2", "label3"};
// zip-представление может принимать один или более аргументов
for (auto [a, b, c] : std::views::zip(first, second, third))
{
// {1,9,"label1"}, {2,8,"label2"}, {3,7,"label3"}
}
// Также через кортежи мы можем изменять исходные представления
for (auto [a, b, c] : std::views::zip(first, second, third))
{
a = a + b;
}
// first == {10, 10, 10, 4, 5}
