: Bir sırasız haritası Aradığınız Ne gibi görünüyor. Hayır, kesinlikle aynı işlevselliği sağlamayı amaçlayan hiç kimse yok. Ama evet, aynısını birkaç farklı şekilde yapabilirsiniz.
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";
Bu sadece sırayla öğeleri depolayarak düzeni korur: Öncelikli olarak eklenen sırayla verilere erişmek için bekliyorsanız, gitmek sonra bariz yolu çiftlerinin basit vektör olacaktır. Onlara anahtar ile erişmeniz gerekiyorsa, belirli bir öğe için doğrusal arama yapmak için std::find
'u kullanabilirsiniz. Bu, çok fazla öğe alırsanız anahtarla yavaş erişim pahasına kullanılan ekstra belleği en aza indirir.
Çok sayıda öğeyle daha hızlı erişim istiyorsanız, bir Boost MultiIndex kullanabilirsiniz. Bundan gerçekten kaçınmak istiyorsanız, kolayca bir dizin oluşturabilirsiniz. Bunu yapmak için, öğelerinizi std::unordered_map
(veya belki de bir std::map
) içine ekleyerek başlarsınız. Bu, anahtara hızlı erişim sağlar, ancak ekleme siparişinde erişim yoktur. Bununla birlikte, her bir öğeye haritaya eklendikçe bir yineleyici döndürür. Ekleme sırasına erişmek için bu yineleyicileri bir vektöre basitçe kaydedebilirsiniz. Bu prensibi oldukça basit olmasına rağmen, kod sakar tarafında biraz, güzel koymak için:
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);
Bu erişim sağlar ya anahtar tarafından:
// ripen the apple:
fruit["apple"] = "red";
...veya ekleme sırayla: Şu an için
for (auto i : in_order)
std::cout << i->first << ": " << i->second << "\n";
, bunu yapmak için temel mekanizma gösterdik - Daha çok kullanmak istiyorsa, muhtemelen güzel bir sınıfa o kadar tamamlamayı isterdim çirkinliğin bazılarını gizleyin ve şeyleri normal kullanımda güzel ve temiz tutun.
Boost.Multiindex için bir iş gibi görünüyor. –
Teşekkürler. Bunu bilmek güzel. Harika C++ 11'de mevcut olduğunu merak ediyorum. – packetie
Bunun anlamı nedir? C++ kütüphanesi, C++ ile kullanabilirsiniz. –