Разделить vector на подвекторы размера n в C++

Ответить
ya
^-^
Сообщения: 2336
Зарегистрирован: 16 дек 2021, 19:56

Разделить vector на подвекторы размера n в C++

Сообщение ya »

https://www.techiedelight.com/ru/split-vector-into-subvectors-cpp/

Код: Выделить всё

#include <iostream>
#include <vector>
 
// Вспомогательная функция для печати вектора
template<typename T>
void print(std::vector<T> const &v)
{
    for (auto &i: v) {
        std::cout << i << ' ';
    }
 
    std::cout << std::endl;
}
 
// Разделить vector на подвекторы размера `n` в C++
int main()
{
    // входной vector целых чисел
    std::vector<int> v = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
 
    // разбить vector на подвекторы размером `n` каждый
    int n = 4;
 
    // определяем общее количество подвекторов размера `n`
    int size = (v.size() - 1) / n + 1;
 
    // создаем массив векторов для хранения подвекторов
    std::vector<int> vec[size];
 
    // каждая итерация этого цикла обрабатывает следующий набор `n` элементов
    // и сохранить его в векторе по k-му индексу в `vec`
    for (int k = 0; k < size; ++k)
    {
        // получаем диапазон для следующего набора `n` элементов
        auto start_itr = std::next(v.cbegin(), k*n);
        auto end_itr = std::next(v.cbegin(), k*n + n);
 
        // выделяем память для подвектора
        vec[k].resize(n);
 
        // код для обработки последнего подвектора, как мог бы
        // содержать меньше элементов
        if (k*n + n > v.size())
        {
            end_itr = v.cend();
            vec[k].resize(v.size() - k*n);
        }
 
        // копируем элементы из входного диапазона в подвектор
        std::copy(start_itr, end_itr, vec[k].begin());
    }
 
    // печатаем подвекторы
    for (int i = 0; i < size; i++) {
        print(vec[i]);
    }
 
    return 0;
}
Ответить