std :: конструкция вектора с построением элементов по месту - PullRequest
5 голосов
/ 03 июня 2019

Можно ли создать std :: vector с начальным размером и создать его элементы на месте?Мой сохраненный тип не может быть скопирован, поэтому это не работает, потому что начальное значение создается как временное и копируется в элементы:

#include <iostream>
#include <memory>
#include <vector>

struct A
{
    A(int i = 0) : i_ (i) {};
    int i_;
    std::unique_ptr<int> p_; // not copyable
};

int main()
{
    std::vector<A> v (10, 1); // error
}

Это близко к тому, что я пытаюсь достичь, и, возможно, этоне так уж и плохо, но мне интересно, есть ли более чистый способ:

int main()
{
    //std::vector<A> v (10, 1); // error

    std::vector<A> v;
    v.reserve (10);
    for (int i = 0; i < 10; ++i) {
        v.emplace_back (1);
    }
}

Я ограничен C ++ 11, но я также заинтересован в решениях C + + 17любопытства.

Ответы [ 3 ]

5 голосов
/ 03 июня 2019

Вы можете использовать std::generate_n:

auto generator = []() {
    return A(1);
};
std::vector<A> v;
v.reserve(10);
std::generate_n(std::back_inserter(v), 10, generator);
1 голос
/ 03 июня 2019

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

Простая версия:

template<typename F>
auto generate_vector(size_t n, F &&f) -> std::vector<decltype(f())>
{
    std::vector<decltype(f())> result;
    result.reserve(n);
    for (size_t i=0; i<n; ++i)
        result.emplace_back(f());

    return result;
}

// Possible use:
auto v = generate_vector(10, [] { return A(); });

https://wandbox.org/permlink/ANqIEMBfhIS5Dp60
исключающее:

template<typename T, typename...Args>
auto generate_vector(size_t n, Args&&...args) -> std::vector<T>
{
    std::vector<T> result;
    result.reserve(n);
    for (size_t i=0; i<n; ++i)
        result.emplace_back(args...);

    return result;
}

https://wandbox.org/permlink/4DHXgRSC9bE9qei9

1 голос
/ 03 июня 2019

Ваше решение цикла выглядит наилучшим образом.

Нет встроенного способа создания вектора с N (для N>1) элементами, построенными с помощью emplace.

...