有没有办法用未初始化的(非零)值构建新的std::vector
,甚至通过生成器更漂亮(类似于{{3构造函数参数,它产生所需的非标准(非常量)值而不用首先将所有元素初始化为零?这是因为我希望(随机)模型创建api尽可能地高效,因此只需编写一次容器元素。为std::vector
(以及可能的其他人)设置一个生成器构造函数不是很好吗?!为什么C ++已经没有将其添加到标准中?
以下类似构造函数的C函数说明了我为std::vector
的自定义初始化构造寻求的一次写入行为:
// Allocate-and-Generate a random int array of length \p n.
int * gen_rand(size_t n)
{
int *v = malloc(n); // allocate only
for (size_t i=0; i<n; i++) {
v[i] = rand(); // first write
}
}
我相信它归结为所使用的STL分配器的行为,因为它负责写入初始零(或不是)。
如果我们将std::vector
构造函数与迭代器一起使用,我们首先必须在其他地方分配和写入随机值,甚至比使用push_back()
更糟糕。
答案 0 :(得分:3)
您可以在使用生成器之前调用vector::reserve
。这将与您显示的C代码具有完全相同的行为。您仍需要使用back_insert_iterator
,因为vector
的大小仍为零。
#include <vector>
#include <cstdlib>
#include <algorithm>
#include <iterator>
#include <iostream>
int main()
{
std::vector<int> v;
v.reserve(10);
std::generate_n(std::back_inserter(v), 10, []() { return rand(); });
for(auto x : v)
std::cout << x << std::endl;
// unsafe version
std::vector<int> v2;
// 10 uninitialized integers
v2.resize(10);
// make sure never to write more than the exact amount, otherwise this will be UB
std::generate_n(v.begin(), 10, []() { return rand(); });
return 0;
}