Tak i nie. Nie, nie ma nikogo, kto specjalnie chciałby zapewnić dokładnie taką samą funkcjonalność. Ale tak, możesz zrobić to samo na kilka różnych sposobów. Jeśli oczekujesz, aby uzyskać dostęp do danych przede wszystkim w celu wstawiony, to oczywistym sposobem, aby przejść byłby prosty wektor par:
std::vector<std::string, std::string> food_colors;
food_colors.push_back({"banana", "yellow"});
food_colors.push_back({"apple", "green"});
food_colors.push_back({"lemon", "yellow"});
for (auto const &f : food_colors)
std::cout << f.first << ": " << f.second << "\n";
ta zachowuje porządek po prostu przechowywanie przedmiotów w porządku. Jeśli chcesz uzyskać do nich dostęp za pomocą klucza, możesz użyć wyszukiwania std::find
, aby wykonać liniowe wyszukiwanie określonego elementu. To minimalizuje dodatkową pamięć używaną, kosztem powolnego dostępu klawiszem, jeśli dostajesz dużo przedmiotów.
Jeśli chcesz mieć szybszy dostęp za pomocą klawisza z dużą liczbą elementów, możesz użyć wielokrotnego indeksu doładowania. Jeśli naprawdę chcesz tego uniknąć, możesz łatwo utworzyć własny indeks. Aby to zrobić, zacznij od wstawienia swoich elementów do std::unordered_map
(lub może std::map
). Zapewnia to szybki dostęp za pomocą klucza, ale brak dostępu w zamówieniu reklamowym. Zwraca jednak iterator do każdego elementu włożonego do mapy. Możesz po prostu zapisać te iteratory w wektorze, aby uzyskać dostęp w kolejności wstawiania. Choć zasada ta jest dość prosta, kod jest nieco niezdarny na bok, aby umieścić go ładnie:
std::map<std::string, std::string> fruit;
std::vector<std::map<std::string, std::string>::iterator> in_order;
in_order.push_back(fruit.insert(std::make_pair("banana", "yellow")).first);
in_order.push_back(fruit.insert(std::make_pair("apple", "green")).first);
in_order.push_back(fruit.insert(std::make_pair("lemon", "yellow")).first);
Umożliwia dostęp poprzez klucz:
// ripen the apple:
fruit["apple"] = "red";
...lub w celu wstawienia:
for (auto i : in_order)
std::cout << i->first << ": " << i->second << "\n";
na chwilę, ja pokazano podstawowy mechanizm ten sposób - jeśli chcesz go używać dużo, to prawdopodobnie chcesz, aby owinąć że się w ładnym do klasy ukryj trochę brzydoty i utrzymuj rzeczy ładne i czyste w normalnym użytkowaniu.
Brzmi jak zadanie dla Boost.Multiindex. –
Dzięki. Dobrze wiedzieć. Ciekawe, że jest dostępny w prostym C++ 11. – packetie
Co to ma znaczyć? Jest to biblioteka C++, więc można jej używać z C++. –