根据转换后的容器元素创建离散分布

时间:2018-09-12 14:25:49

标签: c++ iterator c++17

假设我们有一个std::vector<T> v,而T是一个具有成员函数U T::f() const的类,其中U可转换为double。我想创建一个std::discrete_distribution<> d(/* v[0].f(), ..., v[v.size() - 1].f() */)。是否可以在不创建包含值v[0].f(), ..., v[v.size() - 1].f()的新容器的情况下实现?

2 个答案:

答案 0 :(得分:2)

boost::transform_iterator之类的东西可以做到。您只需要从向量的迭代器创建它们即可。

答案 1 :(得分:1)

如果您可以将operator double添加到T,则可以让该返回值f(),然后使用std::discrete_distribution的迭代器构造函数,如

struct Foo
{
    operator double() const { return f(); }
    double f() const { return 1.0; }
};

int main()
{
    std::vector<Foo> foo(10);
    std::discrete_distribution dd{foo.begin(), foo.end()};
}