Initialisierung von std :: discrete_distribution in VS2013

8

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

%Vor%

aber VS2013 scheint keinen Konstruktor für std :: discrete_distribution zu haben, der einen Iterator-Bereich akzeptiert. Gibt es eine Problemumgehung?

    
pighead10 22.02.2014, 19:33
quelle

2 Antworten

10

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

%Vor%

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.

    
stefan 22.02.2014, 20:01
quelle
0
%Vor%

oder in Bezug auf Iteratoren:

%Vor%

Dadurch wird vermieden, dass eine veränderbare Variable i erfasst werden muss. Der Parameter, der an Lambda übergeben wird, kann als Index verwendet werden.

    
ChetS 29.06.2016 20:02
quelle