В любом случае работает. Второй способ немного эффективнее , если вы резервируете правильную емкость в первую очередь. Лично я считаю стандартные алгоритмы более выразительными. Я бы сделал это так:
std::vector<std::unique_ptr<int>> vec;
vec.reserve(N);
std::generate_n(std::back_inserter(vec), N, [] { return std::make_unique<int>(); });