std :: map find_if Bedingung Stil Verwirrung

8

Ich möchte std :: find_if verwenden, um nach dem ersten Element in meiner Map zu suchen, das in einem bestimmten Element seiner Wertestruktur einen bestimmten Wert hat. Ich bin ein wenig verwirrt. Ich denke, ich muss bind1st oder bind2nd verwenden, aber ich bin nicht sicher, dass das der richtige Weg ist.

Hier ist ein Pseudocode:

%Vor%

Nehmen wir an, ich wollte das erste Element der Map finden, in dem das .x-Element des ValueType einem bestimmten ganzzahligen Wert entspricht (der jeden Aufruf ändern kann).

Was wäre der beste Weg, um eine Funktion oder ein Funktionsobjekt zu schreiben, um dies zu erreichen? Ich verstehe, dass das ein unäres Prädikat sein muss, das mich denken lässt, dass ich bind1st oder bind2nd brauche, um den ganzzahligen Wert zu liefern, nach dem ich suche, aber ich bin mir nicht sicher, wie ich das machen soll. Es ist viel zu lange her, dass ich mir dieses Zeug angesehen habe! & gt;. & lt;

    
John Humphreys - w00te 08.11.2011, 16:55
quelle

7 Antworten

15

Elemente in der Map sind nicht nach Wert sortiert, sie sind nach dem Schlüssel sortiert. Der Satz "das erste Element" hat also wenig Sinn.

Um einige -Elemente (nicht die ersten) zu finden, deren x einem Wert entspricht, können Sie den Funktor wie folgt schreiben:

%Vor%

Dann benutze es wie folgt:

%Vor%     
Kirill V. Lyadvinsky 08.11.2011, 17:01
quelle
11

Sie können eine Lambda-Funktion verwenden

%Vor%

Aber wie Kirill V. Lyadvinsky antwortet, könnte das "erste" Element nicht das sein, was Sie erwarten.

    
Tyler Hyndman 08.11.2011 17:10
quelle
3
%Vor%     
John 08.11.2011 17:03
quelle
1

Wenn Sie auch in Werten suchen möchten, dann verwenden Sie besser Boost Bimap , um nicht zu langsam zu sein?

    
Narek 08.11.2011 17:07
quelle
1

Dies hat nichts mit std::bind1st oder std::bind2nd zu tun. Zuallererst müssen Sie bedenken, dass die Elemente einer Karte Schlüssel / Wert-Paare sind, in Ihrem Fall std::pair<int,ValueType> . Dann brauchen Sie nur ein Prädikat, das das x-Mitglied des zweiten Mitglieds eines Paares mit einem bestimmten Wert vergleicht:

%Vor%     
Christian Rau 08.11.2011 17:12
quelle
1

mit Boost.Bind und Boost.Lambda :

%Vor%     
Andriy Tylychko 08.11.2011 17:28
quelle
1

Aufbauend auf alle obigen Antworten schummle ich mit declltype mit C ++ 11 Semantik.

%Vor%     
Al Conrad 08.03.2016 14:05
quelle

Tags und Links