eine Karte erstellen, aus zwei Vektoren
Wenn ich zwei stl-Vektoren vect1, vect2 und ich produzieren möchten von Ihnen eine Karte, so erste element aus vect1, entsprechen einem ersten element in vect2 und so weiter.
Wie kann ich tun, dass in den meisten einfachen Weg?
- Was wollen Sie passieren, wenn Sie verschiedene Größen haben?
Du musst angemeldet sein, um einen Kommentar abzugeben.
assert
mit einer Ausnahme oder sowas. Niemand mag einen library-call durch, der hält Ihr Programm!a
Duplikate enthält ? Sie möchtenif (m.find(a[i]) != m.end()) m.insert(a[i]) else throw ...
.insert
zurück-pair-Mädchen mit einem iterator zu dem element und einem booleschen Wert, der angibt, ob es eingefügt wurde, oder es schon vorhanden war. Es gibt keine Notwendigkeit zu tun, die Vorherige Suche.if (!m.insert(std::make_pair(a[i], b[i])).second) throw ...
Hier ist eine Lösung unter Verwendung von standard-Bibliotheks-Funktionen (und C++0x-Lambda-Ausdrücke).
Hinweis: Dies setzt Voraus, vec1.size() ist nicht größer als vec2.size().
std::transform(vec1.begin(), vec1.end(), vec2.begin(), std::inserter(my_map, my_map.end()), std::make_pair<int, std::string>);
std::make_pair
als ein binäres Funktionsobjekt.std::bind
mit dem gleichen Ergebnis. Lambdas wieder zu gewinnen.Verwenden wir die version von std::transform, dass dauert 2 input-Sequenzen. (Nicht so bekannt ist, erscheint es als die eine, eine einzige Sequenz).
Können Sie in
std::make_pair<v1::value_type, v2::value_type>
als Ihr Transformator (op), also in deinem FallHabe ich getestet, der code und kompiliert er fein mit GNU-4.3.2
(Habe ich auch getestet, jetzt mit C++11. Es funktioniert, wenn ich geändert make_pair zu nehmen, int const& statt int).
Wenn die beiden Eingabesequenzen unterschiedlich lang, es wird in Ordnung sein, wenn die erste ist kürzer, und spätere Elemente in der zweiten Sequenz wird ignoriert. Wenn der erste länger ist, erzeugt Undefiniertes Verhalten.
std::transform
Algorithmus, der zwei Sequenzen und eine binäre Funktion Objekt.std::transform
nimmt eine Sequenz und ein output-iterator verwendet wird (wobei das transformierte Ergebnis wird so geschrieben)...std::transform
Algorithmus.std::transform
. Auch ich betrogen und benutzt einen C++0x-lambda-Ausdruck, weil es macht die ganze Sache so einfach.auto
variable, wenn ich übergeben Sie es herum, oder rufen Sie es in mehreren Orten. Sie sind wirklich ordentlich, sobald Sie an Sie gewöhnen./usr/include/c++/4.8.1/bits/stl_algo.h:4988:46: error: cannot bind ‘int’ lvalue to ‘int&&’
Die lambda funktioniert gut und ist wahrscheinlich der Weg zu gehen, wenn es um die c++11.Hier ist eine leichte Variante, die verwendet boost ist
zip_iterator
okay, hier ist ein einfacher version mit
std::transform
ich bin mir nicht bewusst, etwas, das bereits vorhanden ist, die die konvertieren kann eineboost::tuple
zu einemstd::pair
daher meine einfache Funktion...std::transform
version, die einzige Sache, die ich bin mir nicht bewusst, ist etwas, das kann bereits die Anpassung an dieboost::tuple
zu einemstd::pair
, aber wo ist der Spaß konform?? 😉vorausgesetzt, Sie gehen zu ignorieren, die extra (Größe vect1 != Größe vect2), könnte dies eine Lösung sein:
EDIT : Danke, Nim für den Hinweis *it1 Sache.
*it1
und*it2
, sonst alles gut...