结构的离散结构

discrete_distrubution of struct

本文关键字:结构      更新时间:2023-10-16

我有一个实值的vector

vector<double> values;

discrete_distribution:

discrete_distribution<size_t> dis(values.begin(), values.end());

但现在我需要double值的向量变成结构的向量:

struct Data
{
   double value;
   int index;
};
vector<Data> values;

如何在不将值复制到单独的vector中的情况下构建相应的discrete_distribution

似乎可以使用以下重载(编号4)

template< class UnaryOperation >
discrete_distribution(std::size_t count, double xmin, double xmax,
                      UnaryOperation unary_op);

像这样。

std::discrete_distribution<int>
make_distribution(const std::vector<Data>& weights)
{
  const auto n = weights.size();
  const auto op = [&weights](double d){
    const auto index = static_cast<std::size_t>(d - 0.5);
    //std::cout << "weights[" << index << "].value == " << weights[index].value << "n";
    return weights[index].value;
  };
  return std::discrete_distribution<int> {n, 0.0, static_cast<double>(n), op};
}

它应该起作用,但它是一个拼凑。

Boost有一个transform_iterator,可以转换迭代器的返回值:
const double get_value(const Data & d)  { return d.value; }

auto beg = boost::make_transform_iterator(values.begin(), get_value);
auto end = boost::make_transform_iterator(values.end(), get_value);
discrete_distribution<size_t> dis(beg, end);

(基于此答案)