Явный вызов конструктора значений после разыменования итератора в std :: vector - PullRequest
0 голосов
/ 18 декабря 2018
  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 должны меняться при каждом проходе цикла, но я здесь опущен для краткости).Код выше, кажется, не делает то, что я хочу.Можно ли сделать явный вызов конструктора значений после того, как уже объявлено distribution_pos?

Ответы [ 2 ]

0 голосов
/ 18 декабря 2018

Я хочу пройтись по этому вектору и вызвать конструктор значения для объекта

Объект уже был построен по умолчанию (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()
            )
        )
    );
}
0 голосов
/ 18 декабря 2018

Нет, вы не можете как конструктор 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);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...