Ich habe eine std::vector<float> weights;
, die die Liste der Gewichte enthält. Ich weiß nicht, was in dieser Liste sein wird, bis zu einem bestimmten Zeitpunkt, an dem das Programm ausgeführt wird. Ich würde gerne tun
aber VS2013 scheint keinen Konstruktor für std :: discrete_distribution zu haben, der einen Iterator-Bereich akzeptiert. Gibt es eine Problemumgehung?
Vergleichen Sie cppreference.com und die Microsoft-Referenz für std::discrete_distribution
:
Dies sind die Konstruktoren, die von VS2013 bereitgestellt werden:
%Vor%Es fehlt ein wichtiger Konstruktor, wahrscheinlich weil die Microsoft-Entwickler nicht die Zeit hatten, ihn zu implementieren:
%Vor%Das heißt, wenn die Dokumentation nicht unvollständig ist, können Sie einfach keinen Iterator-basierten Konstruktor für diese Klasse verwenden. Wechseln Sie zu einem anderen Compiler (wie clang oder g ++), oder warten Sie, bis diese Funktion implementiert ist.
Nun zu einer Problemumgehung, die Sie jetzt verwenden können:
%Vor% Ich hoffe, dass mindestens lambdas unterstützt werden ;-) Wichtig ist, dass i
durch Verweis erfasst wird, so dass es richtig inkrementiert wird. Demo: Ссылка
Warum funktioniert das? Der Konstruktor, den wir hier verwenden, ist:
%Vor% Die Dokumentation zu cppreference sagt uns, dass count
(in unserem Fall weights.size()
), sowie xmin
und xmax
wird verwendet, um die Gewichtung mit UnaryOperation
zu erstellen.
Wir ignorieren xmin
und xmax
absichtlich. Als UnaryOperation
verwenden wir das Lambda
oder
%Vor%wenn Sie bevorzugen.
Nun ignorieren wir den Eingabewert für diesen Operator und geben nur das i-te Element unseres Vektors zurück. Wir erfassen sowohl den Vektor als auch den Index als Referenz, um Kopien zu vermeiden.
Tags und Links c++ c++11 c++-standard-library visual-studio-2013 std