std :: for_each über std :: set, C ++ 11

7

Iterieren über einen Vektor funktioniert:

%Vor%

aber nicht über einen Satz (Kompilierfehler):

%Vor%

Warum kann ich nicht über ein std::set mit std::for_each iterieren?

Bonusfrage: Außerdem möchte ich das int& im Argument von Lambda zu auto& ändern, warum kann dies nicht automatisch abgeleitet werden?

    
eisbaw 14.11.2011, 22:18
quelle

4 Antworten

19

std::set<T>::value_type ist T const , nicht T ; Folglich muss das Argument für Ihr Lambda ein Werttyp sein (d. h. Kopie) oder int const& (und technisch oder int const volatile& ), nicht int& . Das heißt, das funktioniert:

%Vor%
  

Bonus Frage: Außerdem würde ich gerne das int& im Argument von Lambda in auto& ändern, warum kann das nicht automatisch abgeleitet werden?

Weil der Standard sagt, dass es nicht möglich ist; Historisch gesehen war dies auf übermäßig komplizierte Interaktionen zwischen lambdas und Konzepten zurückzuführen (bevor die Konzepte aus dem Entwurf entfernt wurden). Ich höre jedoch Gerüchte, dass der erste Fehler, der an den neuen (C ++ 11) Standard berichtet, genau dies angeht, also ist es möglich, dass Sie innerhalb des nächsten Jahres Unterstützung für diesen zusätzlichen Compiler Ihrer Wahl erhalten zwei. BEARBEITEN : Oh, schau, C ++ 14 hat jetzt polymorphe Lambdas ...

    
ildjarn 14.11.2011, 22:21
quelle
3

Zur Bonusfrage: Ein "auto" -Funktionsargument ist nicht spezifisch für Lambdas. Sie können sich auch fragen, warum wir alle Funktionen nicht als f(auto x, auto y) deklarieren dürfen. Das bedeutet aber im Wesentlichen, dass Sie alle Funktionen durch Funktionsschablonen ersetzen wollen. Dies wurde als nicht gut mit der bestehenden C ++ - Sprache und insbesondere dem Typsystem angesehen. Wenn Sie eine Funktionsvorlage haben möchten, gibt es bereits eine bestehende Syntax und einen Mechanismus, und das Erklären von "automatischen" Argumenten ist nicht der richtige Weg.

    
Kerrek SB 14.11.2011 22:48
quelle
1

Ein dereferenzierter set<int> Iterator ist ein const int& . Sie können es also nicht als int& -Parameter ohne const übergeben. Probieren Sie entweder einfach (int i) oder (const int& i) .

Und das ist wirklich nicht einer der Orte, an denen du auto benutzen darfst. Ich denke auto funktioniert nur in einer Deklaration mit Initialisierer oder als Platzhalter für einen abschließenden Rückgabetyp.

    
aschepler 14.11.2011 22:23
quelle
0

Sie sollten in der Lage sein, über eine Menge zu iterieren. Beachten Sie jedoch, dass das Element in einem Set auch sein Schlüssel ist und daher nicht geändert werden kann. Ändern Sie Ihren Code so, dass er eine const -Referenz verwendet, und verwenden Sie stattdessen cbegin/cend , unabhängig davon, ob eine Menge gesetzt ist oder nicht, wenn Sie die Elemente nicht ändern.

    
K-ballo 14.11.2011 22:21
quelle

Tags und Links