在将迭代器解引用为std :: vector <std :: uniform_real_distribution <double>>后,显式调用值构造函数

时间:2018-12-18 20:07:48

标签: c++ random constructor

hadamard=bdiag(matrix(1,500,500),matrix(1,300,300),...))
D*hadamard

我想本质上声明一个 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); } 对象的向量(大小10)。然后,我想遍历此向量并调用对象的值构造函数(std::uniform_real_distribution<double>0.0的数字应在循环的每次遍历中更改,但为简洁起见,在此省略)。上面的代码似乎没有满足我的要求。在已经声明1.0之后是否可以对值构造函数进行显式调用?

2 个答案:

答案 0 :(得分:4)

不,您不能像std::vector's constructor那样默认构造并推入值,因此无法再次构造它们。

要避免这种情况,而不是创建一个具有该大小的向量,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);
}

答案 1 :(得分:3)

  

我想遍历此向量,并为   对象

该对象已经默认使用(0.0,1.0)构造,您不能再次调用构造函数。不过,您可以通过取消引用迭代器并为其分配分配新分配:

    *it = std::uniform_real_distribution<double>(0.0,1.0);

或使用基于范围的for循环:

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