Добавление элементов в std :: vector повторным способом - PullRequest
0 голосов
/ 05 января 2019

Я хочу скопировать значения из одного вектора в другой, которые будут храниться в определенном порядке, а второй вектор будет содержать больше элементов, чем первый.

Например:

vector<int> temp;
temp.push_back(2);
temp.push_back(0);
temp.push_back(1);
int size1 = temp.size();

int size2 = 4;
vector<int> temp2(size1 * size2);

А теперь я хотел бы заполнить temp2 так: {2, 2, 2, 2, 0, 0, 0, 0, 1, 1, 1, 1}.

Можно ли сделать это, используя только алгоритмы (например, заливка)?

Ответы [ 2 ]

0 голосов
/ 05 января 2019

Да, возможно использование алгоритма std::generate_n:

int main() {
    std::vector<int> base{1, 0, 2};
    const int factor = 4;
    std::vector<int> out{};

    std::generate_n(std::back_inserter(out), base.size() * factor,
            [&base, counter=0]() mutable {
        return base[counter++ / factor];
    });

    for(const auto i : out) {
        std::cout << i << ' ';
    }
}

Этот код печатает: 1 1 1 1 0 0 0 0 2 2 2 2

Ключ - лямбда, используемая в std::generate_n. Он работает на внутреннем счетчике, чтобы узнать, какие значения на основе вектора base (и доступ к ним зависит от значений factor и counter) для генерации.

0 голосов
/ 05 января 2019

Нет, это довольно специфический вариант использования, но вы можете легко реализовать его самостоятельно.

#include <vector>
#include <iostream>

std::vector<int> Elongate(const std::vector<int>& src, const size_t factor)
{
    std::vector<int> result;
    result.reserve(src.size() * factor);

    for (const auto& el : src)
       result.insert(result.end(), factor, el);

    return result;
}

int main()
{
   std::vector<int> temp{2, 0, 1};
   std::vector<int> real = Elongate(temp, 4);

   for (const auto& el : real)
       std::cerr << el << ' ';
   std::cerr << '\n';
}

( живое демо )

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...