Создать дискретное распределение из преобразованных элементов контейнера - PullRequest
0 голосов
/ 12 сентября 2018

Предположим, у нас есть 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 голосов
/ 12 сентября 2018

Если вы можете добавить 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()};
}
0 голосов
/ 12 сентября 2018

Что-то вроде boost::transform_iterator может сделать это.Вам просто нужно создать их из итераторов вектора.

...