2010-03-06 8 views
5

muszę mieć mapę takiego:Wyszukiwanie i Wstawianie w mapie z 3 elementów w C++

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

Jaka jest składnia do wstawienia i wyszukiwanie elementów pary w tej mapie.

+2

Który (e) jest/są klucz (y)? – sbi

+0

Sprawdź, czy tutaj się nie mylisz. Mapa może zawierać trzeci element, jeśli jest to polecenie zamawiania. – Owl

Odpowiedz

12

Można odwzorować tylko jeden typ klucza na jeden typ danych. Jeśli dane zawierają 2 elementy, użyj struct lub 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

Należy unikać kopiowania pary z mapy, przypisując odniesienie: std :: pair & val = m [245]; –

6

Nie możesz mieć trzech elementów. STL map przechowuje parę klucz-wartość. Musisz zdecydować, co zamierzasz użyć jako klucza. Gdy to zrobisz, możesz prawdopodobnie gniazdo dwa pozostałe w osobnej mapie i używać go jako:

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

Aby wstawić na mapie, użyj operator[] lub funkcji składowej insert. Możesz wyszukiwać za pomocą funkcji składowej find.

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 ... 
} 

Dodatkowo można spojrzeć na Boost.Tuple.

+0

Dzięki za informacje. Jak wyszukać parę w Mapie? Czy będzie to m.find (STD :: make_pair (3.2, "a");? – John

+0

@John: Zawsze wyszukujesz klucz, jeśli twój klucz jest typu "para ", to jest to, co przekazujesz jako argument na 'map :: find'. Uwaga: na mapie pierwszy parametr jest kluczem, drugi jest wartością klucza, albo może być złożonym typem, jednak klucz jest zawsze" const "i nie może być przypisany do: – dirkgently

+0

@dirkgently: powyższy przykład nie działa, jeśli używam dwóch instancji wskaźnika klasy i ciągu znaków, takich jak typedef std :: map > – kar

6

Zastosowanie albo

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

lub

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

cokolwiek jest poprawne.

+0

Zauważ, że ten pierwszy będzie wymagał albo przeciążonego 'operatora <' albo obiektu funkcji do sortowania przekazanego do mapy. – sbi

+2

std :: pair ma już operatora <(robi to porównanie leksykograficzne) – Tronic

+0

@Tronic: Czy to? sbi

Powiązane problemy