2010-03-06 2 views
5

brauche ich so eine Karte haben:Suchen und Einfügen in einer Karte mit 3 Elementen in C++

typedef std::map<int, float , char> Maptype ; 

Was die Syntax Elemente des Paares in dieser Karte einfügen und auf der Suche.

+2

Welche (s) ist/sind der/die Schlüssel? – sbi

+0

Bitte überprüfen Sie, dass Sie hier nicht verwirrt sind. Eine Map kann ein drittes Element enthalten, wenn es sich um einen Ordnungsbefehl handelt. – Owl

Antwort

12

Ein map kann nur einen Schlüsseltyp einem Datentyp zuordnen. Wenn die Daten 2 Elemente enthalten, verwenden Sie eine Struktur oder std::pair.

typedef std::map<int, std::pair<float, char> > Maptype; 
... 
Maptype m; 
m[123] = std::make_pair(0.5f, 'c'); 
... 
std::pair<float, char> val = m[245]; 
std::cout << "float: " << val.first << ", char: " << val.second << std::endl; 
+0

Vermeiden Sie es, das Paar aus der Karte zu kopieren, indem Sie eine Referenz zuweisen: Std :: Paar & val = m [245]; –

6

Sie können nicht drei Elemente haben. Die STL map speichert ein Schlüssel/Wert-Paar. Sie müssen entscheiden, was Sie als Schlüssel verwenden werden. Ist das erledigt, können Sie wahrscheinlich Nest die anderen beiden in einer separaten Karte und verwenden Sie es als:

typedef std::map<int, std::map<float, char> > MapType; 

Um in einer Karte einzufügen, verwenden Sie die operator[] oder die insert Memberfunktion. Sie können nach der Elementfunktion find suchen.

MapType m; 
// insert 
m.insert(std::make_pair(4, std::make_pair(3.2, 'a'))); 
m[ -4 ] = make_pair(2.4, 'z'); 
// fnd 
MapType::iterator i = m.find(-4); 
if (i != m.end()) { // item exists ... 
} 

Zusätzlich können Sie bei Boost.Tuple suchen.

+0

Danke für Infos. Wie suche ich nach dem Paar in Map? Wird es m.find sein (STD :: make_pair (3.2, 'a');? – John

+0

@John: Du suchst immer nach dem Schlüssel. Wenn dein Schlüssel vom Typ 'pair ' ist, dann passierst du das als Argument zu "map :: find". Beachten Sie, dass in einer Map der erste Parameter der Schlüssel ist, der zweite der Wert des Schlüssels. Entweder kann ein komplexer Typ sein. Der Schlüssel ist jedoch immer "const" und kann nicht sein assigned to. – dirkgently

+0

@dirkgently: Das obige Beispiel funktioniert nicht, wenn ich zwei Klassenzeigerinstanzen und eine Zeichenkette verwende, wie typedef std :: map > – kar

6

Verwenden Sie entweder

std::map<std::pair<int, float>, char> 

oder

std::map<int, std::pair<float, char> > 

je nachdem, was richtig ist.

+0

Beachten Sie, dass erstere entweder einen überladenen 'operator <' oder ein Funktionsobjekt zum Sortieren benötigen würde, das an die Map übergeben wird – sbi

+2

std :: pair hat bereits Operator <(lexikographischer Vergleich) – Tronic

+0

@Tronic: Ist es das? sbi

Verwandte Themen