是否可以构造具有初始大小的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解决方案也很感兴趣。
答案 0 :(得分:5)
您可以使用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 :(得分:1)
您的循环解决方案看起来是最好的方法。
没有内置的方法来创建带有N
(对于N>1
)的Emplace构造元素的向量。
答案 2 :(得分:1)
当您认为代码的某些部分过于冗长并且会多次出现时,只需创建一个辅助函数,使其尽可能通用。
简单版本:
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
xor:
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;
}