在将迭代器取消引用为std::vector<std::uniform_real_distribution<双


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.01.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()
)
)
);
}

相关内容

最新更新