Ich habe ein foo
was ein std::vector<int>
ist. Es stellt die "Kanten" -Werte für eine Reihe von Bereichen dar.
Wenn beispielsweise foo
{1, 3, 5, 7, 11} ist, sind die Bereiche 1-3, 3-5, 5-7, 7-11. Für mich bedeutet das 4 Perioden. Beachten Sie, dass jede Periode die erste Zahl in einem Bereich enthält und nicht die letzte. In meinem Beispiel erscheint 8 in der 3. (nullbasierten) Periode. 7 erscheint auch in der 3. Periode. 11 und oben erscheint nirgendwo. 2 erscheint in der 0. Periode.
Wenn bar
ein int
ist, verwende ich
um mir den Zeitraum anzugeben, der bar
enthalten soll.
Mein Problem: std::bind2nd
ist veraltet, daher sollte ich umgestalten. Was ist die äquivalente Aussage mit aktualisierten Funktionen? std::bind
"fällt" nicht auf die naheliegende Art ein.
In C ++ 11 können Sie std::bind
; es ist einfach nicht so offensichtlich, wie man es benutzt:
Der Schlüssel ist die Verwendung des Platzhalterarguments, das im Namespace std::placeholders
deklariert ist. std::bind
gibt ein Funktionsobjekt zurück, das beim Aufruf eine bestimmte Anzahl von Parametern akzeptiert. Die Platzhalter, die innerhalb des Aufrufs von std::bind
verwendet werden, zeigen, wie die Argumente, die beim Aufrufen des resultierenden Objekts bereitgestellt werden, der Argumentliste der aufrufbaren Bindung zugeordnet werden, an die Sie binden. Also zum Beispiel:
Wie wäre es, direkt aus der Steinzeit ( bind2nd
) in die Eisenzeit mit einem C ++ 14 generischen Lambda zu gelangen und die Bronzezeit ( bind
) zu umgehen?
Und wenn die Eingabe sortiert ist
%Vor% Lambdas lesen sich viel einfacher und sind auch einfacher zu inline als std::bind
expresions. Siehe z.B. Lavevejs CppCon 2015 sprechen .
bind
version wäre:
aber ich denke, es ist mehr ermutigt, lambdas zu verwenden, wie in:
%Vor% Es wird auch empfohlen, überladene Funktionen begin/end
anstelle von Methodenaufrufen zu verwenden. also wäre es wie: