Daily bit(e) C++. std::views::zip

Добавлено 24 сентября 2026 в 05:30

Daily bit(e) C++ 116, zip-представление в C++23 – std::views::zip.

Daily bit(e) C++

Представление 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}

Пример на Compiler Explorer

Теги

C++ / CppDaily bit(e) C++Программирование