Ich möchte Werte kopieren, die mit einem Prädikat (equal ints) von map::iterator
zu einem pair<string const,int>
übereinstimmen.
Das habe ich versucht:
%Vor%Die Fehlermeldung von g ++ 4.6.1 lautet:
%Vor%Gibt es eine Möglichkeit, das Beispiel an die obige Kopie anzupassen?
Mit vector::iterator
ist es so einfach wie:
int
erlaubt nicht die Übertragung von einem Typ zu einem anderen, nur um zu filtern, was kopiert werden soll.
Sie könnten copy_if
verwenden, um den Schlüssel loszuwerden und dann for_each
:
Eine einfache for-Schleife wäre jedoch effizienter und viel einfacher zu lesen.
Ich kann nicht verstehen, warum die einfache for-loop-Lösung nicht der bevorzugte Ansatz für dieses Problem ist
%Vor%Außer dass es den Code lesbarer macht, ist es besser. Ich habe einen einfachen Benchmark geschrieben, um zu sehen, wie sich eine for-Schleife im Vergleich zu den anderen vorgeschlagenen Lösungen verhält:
%Vor%Die Ergebnisse, die ich erhalten habe, sind die folgenden:
%Vor% Vermutlich möchten Sie nur die zugehörigen Werte von push_back
abrufen, nicht die Schlüssel.
Die SGI-Version von STL hat %code% und %code% Iteratoren für diese Art von Aufgabe.
Ich persönlich glaube jedoch nicht, dass dies wirklich mit einer Kopie geschehen sollte - Sie transformieren die Daten, kopieren sie nicht. Daher würde ich empfehlen, %code% mit einem Funktor zu verwenden, um das zweite Element des Paares zurückzugeben.
Der Compiler-Fehler ist eigentlich ziemlich knapp:
%Vor%Und genau das ist das Problem. Das %code% , von dem du kopierst, hat Iteratoren, die auf ein %code% dereferenzieren, und es gibt keine Möglichkeit, implizit ein %code% auf nur ein %code% zu transformieren.
Aus diesem Grund können Sie %code% oder %code% nicht verwenden, um von einem %code% in ein %code% zu kopieren; aber die Standardbibliothek stellt einen Algorithmus zur Verfügung, den Sie verwenden können, kreativ genannt %code% . %code% ist sehr ähnlich zu %code% , da zwei Quell-Iteratoren und ein Ziel-Iterator benötigt werden. Der Unterschied ist %code% nimmt auch eine unäre Funktion, die die eigentliche Transformation durchführt. Mit einem C ++ 11 Lambda können Sie den gesamten Inhalt eines %code% in ein %code% wie folgt kopieren:
%Vor%Was ist, wenn Sie nicht den gesamten Inhalt von %code% kopieren möchten, sondern nur einige Elemente, die die certian Kriterien erfüllen? Einfach, verwenden Sie einfach %code% .
Was ist das, sagst du? Es gibt keine %code% in der Standardbibliothek? Nun ja, du hast da einen Punkt. Frustrierend gibt es keine %code% in der Standardbibliothek. Allerdings Schreiben eines ist eine einfache Aufgabe. Hier ist der Code:
%Vor%Wie Sie vielleicht denken, ist die Verwendung von %code% so, als würde Sie %code% übernehmen und zusammen mit %code% zusammenfügen. Hier ist ein Beispiel für einen Pseudo-Code:
%Vor%Der Compiler-Fehler ist eigentlich ziemlich knapp:
%Vor% Und genau das ist das Problem. Das map
, von dem du kopierst, hat Iteratoren, die auf ein pair<KEY,VALUE>
dereferenzieren, und es gibt keine Möglichkeit, implizit ein pair<KEY,VALUE>
auf nur ein VALUE
zu transformieren.
Aus diesem Grund können Sie copy
oder copy_if
nicht verwenden, um von einem map
in ein vector
zu kopieren; aber die Standardbibliothek stellt einen Algorithmus zur Verfügung, den Sie verwenden können, kreativ genannt transform
. transform
ist sehr ähnlich zu copy
, da zwei Quell-Iteratoren und ein Ziel-Iterator benötigt werden. Der Unterschied ist transform
nimmt auch eine unäre Funktion, die die eigentliche Transformation durchführt. Mit einem C ++ 11 Lambda können Sie den gesamten Inhalt eines map
in ein vector
wie folgt kopieren:
Was ist, wenn Sie nicht den gesamten Inhalt von map
kopieren möchten, sondern nur einige Elemente, die die certian Kriterien erfüllen? Einfach, verwenden Sie einfach transform_if
.
Was ist das, sagst du? Es gibt keine transform_if
in der Standardbibliothek? Nun ja, du hast da einen Punkt. Frustrierend gibt es keine transform_if
in der Standardbibliothek. Allerdings Schreiben eines ist eine einfache Aufgabe. Hier ist der Code:
Wie Sie vielleicht denken, ist die Verwendung von transform_if
so, als würde Sie copy_if
übernehmen und zusammen mit transform
zusammenfügen. Hier ist ein Beispiel für einen Pseudo-Code:
std::copy_if
erlaubt nicht die Übertragung von einem Typ zu einem anderen, nur um zu filtern, was kopiert werden soll.
Sie könnten std::transform
verwenden, um den Schlüssel loszuwerden und dann std::remove_if
:
Eine einfache for-Schleife wäre jedoch effizienter und viel einfacher zu lesen.
Ich kann nicht verstehen, warum die einfache for-loop-Lösung nicht der bevorzugte Ansatz für dieses Problem ist
%Vor%Außer dass es den Code lesbarer macht, ist es besser. Ich habe einen einfachen Benchmark geschrieben, um zu sehen, wie sich eine for-Schleife im Vergleich zu den anderen vorgeschlagenen Lösungen verhält:
%Vor%Die Ergebnisse, die ich erhalten habe, sind die folgenden:
%Vor% Vermutlich möchten Sie nur die zugehörigen Werte von map
abrufen, nicht die Schlüssel.
Die SGI-Version von STL hat select1st
und select2nd
Iteratoren für diese Art von Aufgabe.
Ich persönlich glaube jedoch nicht, dass dies wirklich mit einer Kopie geschehen sollte - Sie transformieren die Daten, kopieren sie nicht. Daher würde ich empfehlen, std::transform
mit einem Funktor zu verwenden, um das zweite Element des Paares zurückzugeben.