2013-04-06 26 views
5

Chcę przechowywać dane według obu, ich nazwy i indeksu. Innymi słowy, chcę przypisać do obiektów nazwy string, a także nadać im niestandardową kolejność.Mapa z wieloma kluczami w C++

Najpierw wymyśliłem std::vector par klucza string i obiektu. Kolejność została podana przez pozycję w wektorze.

std::vector<std::pair<std::string, object> > 

Ale takie podejście wydaje się być suboptimal ponieważ nie automatycznego sprawdzania niepowtarzalności string nazwisk. Co więcej, niewłaściwe jest grupowanie obiektów według ich kolejności, ponieważ logicznie rozróżnienie pierwszego rzędu jest imieniem.

Potrzebuję struktury danych, która umożliwia dostęp zarówno po nazwie, jak i indeksie.

std::magic<std::string, unsigned int, object> collection; 

// access by either string or unsigned int key 
collection.insert("name", 42, new object()); 
collection["name"] 
collection[42] 

Czy istnieje już struktura danych dla tego przypadku użycia? Jeśli nie, jak mogę je połączyć, najlepiej przy użyciu standardowej biblioteki? Chciałbym również wstawić nowe elementy w miejscu po danym elemencie, nie poruszając wszystkich dalszych elementów.

+1

Potrzebne są dwa obiekty 'std :: map'. –

+0

@ n.m. Nie muszę zamawiać według nazwy ciągu. Więc w zasadzie potrzebuję 'std :: vector' dla porządku i' std :: unordered_map' dla nazw. Ale moje pytanie brzmi, czy istnieje już rozwiązanie lub przynajmniej preferowany sposób. – danijar

+1

'unordered_map' jest możliwe, jeśli używasz C++ 11. W przypadku indeksów wybór między 'vector' i' map'/'unordered_map' jest podyktowany tym, co powinno się stać, gdy usuniesz elementy z kolekcji. Jeśli nie zależy Ci na stabilnych indeksach, możesz użyć 'wektora'. Myślę, że dwa pojemniki * są * preferowanym sposobem. –

Odpowiedz