std::vector<std::uniform_real_distribution<double> > distribution_pos(10);
for(auto it = distribution_pos.begin(); it != distribution_pos.end(); it++)
{
it->std::uniform_real_distribution<double>(0.0,1.0);
}
我想声明一个std::uniform_real_distribution<double>
对象的向量(大小为10(。然后我想循环通过这个向量,并调用对象的值构造函数(每次循环时,0.0
和1.0
的数字应该会改变,但为了简洁起见,我在这里省略了它(。上面的代码似乎没有达到我想要的效果。在声明了distribution_pos
之后,是否可以显式调用值构造函数?
不,不能作为std::vector
的构造函数默认构造并推送值,因此不能再次构造值。
为了避免这种情况,不需要创建这样大小的向量,reserve(10)
(它不构造任何东西,只是保留内存(,然后你可以emplace_back
这些值,它将构造一个具有给定参数的对象。
std::vector<std::uniform_real_distribution<double> > distribution_pos;
distribution_pos.reserve(10);
for (std::size_t i = 0; i < 10; ++i) {
distribution_pos.emplace_back(0.0, 1.0);
}
我想循环通过这个向量,并调用的值构造函数对象
对象已经默认使用(0.0,1.0(构造,您不能再次调用构造函数。但是,可以通过取消引用迭代器并分配给它来分配一个新的分布:
*it = std::uniform_real_distribution<double>(0.0,1.0);
或者使用基于范围的循环:
for(auto &dist : distribution_pos) {
dist = std::uniform_real_distribution<double>(0.0,1.0);
}
如果真的想保留原始分布(也许是为了保持其内部状态(,可以替换其参数对象:
for(auto &dist : distribution_pos) {
// get the current parameters
auto params = dist.param();
// create new and replace the old parameters
dist.param(
std::move(
std::uniform_real_distribution<double>::param_type(
params.a(), params.b()
)
)
);
}