Gewusst wie: abrufen aller Tasten (oder Werte) von einer std::map und lege Sie in einen vector?
Dies ist eine der Möglichkeiten, aus dem ich komme:
struct RetrieveKey
{
template <typename T>
typename T::first_type operator()(T keyValuePair) const
{
return keyValuePair.first;
}
};
map<int, int> m;
vector<int> keys;
//Retrieve all keys
transform(m.begin(), m.end(), back_inserter(keys), RetrieveKey());
//Dump all keys
copy(keys.begin(), keys.end(), ostream_iterator<int>(cout, "\n"));
Natürlich können wir uns auch um alle Werte aus der Karte durch die Definition weiterer Funktor RetrieveValues.
Gibt es eine andere Möglichkeit dies zu erreichen einfach? (Ich bin immer Fragen, warum std::map nicht enthalten ist eine member-Funktion für uns zu tun.)
InformationsquelleAutor der Frage Owen | 2008-09-21
Du musst angemeldet sein, um einen Kommentar abzugeben.
Während Ihre Lösung sollte funktionieren, kann es schwierig sein, zu Lesen, je nach skill-level, Ihre Kollegen Programmierer. Darüber hinaus bewegt sich die Funktionalität entfernt von der call-Seite. Die Wartung ein wenig schwieriger.
Ich bin mir nicht sicher, ob Ihr Ziel ist es, die Schlüssel in einen Vektor oder ausdrucken zu cout, also mache ich beides. Sie können versuchen, so etwas wie dieses:
Oder noch einfacher, wenn Sie mit Boost:
Persönlich, ich mag die BOOST_FOREACH-version, weil es ist weniger Tipparbeit und es ist sehr explizit über was Sie tut.
InformationsquelleAutor der Antwort Jere.Jones
InformationsquelleAutor der Antwort Juan
Es ist ein Absenkung Adapter für diesen Zweck:
Gibt es eine ähnliche map_values Auswahl Adapter für die Extraktion der Werte.
InformationsquelleAutor der Antwort Alastair
C++0x hat uns eine weitere, gute Lösung:
InformationsquelleAutor der Antwort DanDan
Die SGI-STL hat eine Erweiterung namens
select1st
. Schade, dass es nicht im standard STL!InformationsquelleAutor der Antwort Chris Jester-Young
Ich denke, die BOOST_FOREACH oben dargestellt ist schön und sauber, allerdings gibt es eine weitere option, mit BOOST auch.
Persönlich, ich glaube nicht, dass dieser Ansatz ist so sauber wie die BOOST_FOREACH Ansatz in diesem Fall, aber boost::lambda kann sehr sauber in allen anderen Fällen.
InformationsquelleAutor der Antwort paxos1977
@DanDan ' s Antwort, mit C++11 ist:
und mit C++14 (wie bereits von @ivan.ukr) wir ersetzen können
decltype(map_in)::value_type
mitauto
.InformationsquelleAutor der Antwort James Hirschorn
Ihre Lösung ist gut, aber Sie können verwenden Sie einen iterator, um es zu tun:
InformationsquelleAutor der Antwort Brian R. Bondy
Auch, wenn Sie noch zu Steigern, verwenden transform_iterator um zu vermeiden, dass eine temporäre Kopie der Schlüssel.
InformationsquelleAutor der Antwort Marcelo Cantos
Können Sie die vielseitige boost::transform_iterator. Die transform_iterator können Sie für die Transformation der iterierten Werte, zum Beispiel in unserem Fall, wenn Sie wollen, sich nur mit dem Schlüssel, nicht die Werte. Sehen http://www.boost.org/doc/libs/1_36_0/libs/iterator/doc/transform_iterator.html#example
InformationsquelleAutor der Antwort amit_grepclub
Die besten nicht-sgi, non-boost -, STL-Lösung zu erweitern map::iterator etwa so:
und verwenden Sie Sie dann etwa so:
InformationsquelleAutor der Antwort Marius
Bisschen c++11:
InformationsquelleAutor der Antwort Rusty Parks
Hier ist eine nette Funktion Vorlage mit C++11 magic, arbeiten für beide std::map, std::unordered_map:
Check it out hier: http://ideone.com/lYBzpL
InformationsquelleAutor der Antwort Clemens Sielaff
Weil Sie es nicht können, besser als Sie es tun können. Wenn eine Methode ist die Implementierung werden keine überlegen eine freie Funktion ist die Umsetzung dann in der Regel sollten Sie nicht schreiben Sie eine Methode; Sie sollten schreiben Sie eine freie Funktion.
Es ist auch nicht sofort klar, warum es nützlich sowieso.
InformationsquelleAutor der Antwort DrPizza