我有一个真实价值的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;如何在不将值复制到分隔的discrete_distribution的情况下构建相应的vector?
发布于 2015-10-31 19:36:49
似乎可以使用以下重载(数字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};
}它应该能起作用,但这是一种假话。
发布于 2015-10-31 19:22:34
Boost有一个迭代器,它可以转换迭代器的返回值:
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);(基于这个答案)
https://stackoverflow.com/questions/33455578
复制相似问题