2010-12-07 12 views
19

Gibt es einen Std-Iterator, den ich benutzen könnte, um Elemente in std :: map einzufügen, indem ich einen std-Algorithmus verwende (zum Beispiel std :: copy)?Wie in std :: map einzufügen?

Ich brauche einen Container, um ein Objekt mit einer Zeichenfolge zu verknüpfen, und ich dachte über die Verwendung von std :: map. Gibt es einen besseren Behälter? Vergessen zu sagen - Gegenstände müssen sortiert werden.

Antwort

23

Ich denke, was die OP für sucht std::inserter(mymap, mymap.end())

ist so können Sie tun:

std::copy(inp.begin(), inp.end(), std::inserter(mymap, mymap.end())); 

Die Eingangstypen müssen ein Paar Typ sein, der Ihre Karte nimmt, sonst Ihr Algorithmus müsste std :: transform mit einer Funktion/funktor sein, um den Eingabetyp in ein solches std :: pair umzuwandeln.

Insert ist eigentlich kein Iterator, sondern eine Template-Funktion, die einen Iterator erzeugt (std :: insert_iterator, ein Template-Typ, aber der Typ wird automatisch im Funktionsaufruf aufgelöst).

+3

Wenn der Eingabebereich sortiert ist, sollte die Verwendung von '.begin()' für den zweiten Parameter die Geschwindigkeit erhöhen. Ansonsten ist es nicht wirklich wichtig. Siehe zum Beispiel http://www.sgi.com/tech/stl/insert_iterator.html. –

12

Um in std::map10 einzufügen, müssen Sie std::make_pair() verwenden.

Zum Beispiel:

std::map<int,std::string> Map; 
Map.insert(std::make_pair(5,"Hello")); 

Versuchen etwas Ähnliches. :)

+2

Dies ist nicht, was er ist. Er fragt nicht, wie man einen Gegenstand in eine Karte einfügt. Er sucht nach einer Möglichkeit, Elemente mithilfe eines der STL-Algorithmen in eine Karte einzufügen. – CadentOrange

+0

Ungefähr zu der Zeit, als diese Frage gestellt und beantwortet wurde, war ich ein bisschen besessen von Reputationspunkten und vermutete tatsächlich etwas über Prasoon, das 13 Upvotes für Antworten wie diese bekam. – CashCow

+0

Keine Antwort auf die Frage: "Gibt es einen Std-Iterator, den ich verwenden könnte ...?" – dmitri

4

Ja, std::copy mehrere Elemente in eine Karte einfügen können, wenn Sie einen std::insert_iterator als OutputIterator verwenden (verwenden Sie die Hilfsfunktion std::inserter diese zu schaffen, auf diese Weise kann der Template-Typ abgeleitet werden). Die "Elemente" einer std :: map sind Schlüssel-Wert-Paare, die Sie mit std::make_pair erstellen können, wie Prasoon veranschaulicht. (Der tatsächliche Typ ist std::pair<Key, Value>; die Hilfsfunktion ermöglicht wiederum die Vorlagentypabzug.) Wenn Sie die Schlüssel in einer Sequenz und die Werte in einem anderen haben, sollten Sie in der Lage sein, std::transform zu verwenden, um eine Sequenz von Schlüssel-Wert-Paaren zu erstellen.