Изменить тип вектора с помощью конструкторов? - PullRequest
0 голосов
/ 10 января 2019

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

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

vector<int> integers = /*something...*/;

vector<clazz> clazzes();
for(auto& n : integers)
{
    clazzes.emplace_back(clazz(n));
}

Ответы [ 2 ]

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

То, что у вас есть, разумно (хотя см. ответ YSC для лучшего подхода). Простое улучшение заключается в резервировании необходимого хранилища, так что emplace_back() никогда не нужно перераспределять:

std::vector<clazz> clazzes;
clazzes.reserve(integers.size());  // <-- HERE
for(auto& n : integers)
{
    clazzes.emplace_back(clazz(n));
}
0 голосов
/ 10 января 2019

Существует конструктор из std::vector, принимающий диапазон и разрешающий пользовательское преобразование. Это то, что вам нужно:

template< class InputIt >
vector( InputIt first, InputIt last, 
    const Allocator& alloc = Allocator() );

Полная программа:

#include <vector>
#include <iostream>

struct Wrapper
{
    int value;
    Wrapper(int n) : value(n) {}
};

int main()
{
    std::vector<int> integers = {0, 1};
    std::vector<Wrapper> wrapped{begin(integers), end(integers)};
    std::cout << wrapped[1].value << '\n';
}

Живая демоверсия

Это не особо оптимизировано, но делает меньше кода, меньше ошибок и меньше wtf / line. Что хорошо (ТМ).

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