2016-03-19 14 views
2

Yani böyle bir unordered_map bildirmek Diyelim:saklamak için nasıl/harita C++ aynı anahtarın erişim birden çok değerin

unordered_map<string, vector<string>> my_map; 

Ve ben böyle içinde saklamak istediğiniz bir değerler listesi var :

vector<string> vec1 = {"banana", "apple"}; 
vector<string> vec2 = {"banana", "banana"}; 
vector<string> vec3 = {"banana", "watermelon"}; 

ben şöyle anahtarı olarak 0 endeksinde dizesini kullanarak, geçmesi ve haritaya her vektör başlatmak eğer:

my_map[vec1[0]] = vec1; 
my_map[vec2[0]] = vec2; 
my_map[vec3[0]] = vec3; 

Unordered_map, aynı erişim anahtarına sahip olmasına rağmen üç vektörü de saklar mı? Ve eğer her bir vektöre erişmek istediysem, yukarıdaki listede göründükleri şekilde aynı şekilde yapabileceğim bir yol var mı?

Yani, örneğin, ben yaptıysa:

vektörler Çıkış1, Çıkış2 ve OUTPUT3 tayin edileceğini
vector<string> output1; 
vector<string> output2; 
vector<string> output3; 

output1 = my_map["banana"]; 
output2 = my_map["banana"]; 
output3 = my_map["banana"]; 

? Eminim bu her şey için aynı vektör olurdu ama unordered_map hangisine karar veriyor? Ve nasıl vec1 çıkış1, vec2 çıkış2, vb atanacak nasıl yapabilirim?

cevap

6

std::unordered_map her bir anahtar için yalnızca bir değeri depolar - son atadığınız son değer, sizin durumunuzda vec3. Her anahtar için birkaç değer kaydetmek istiyorsanız, std::multimap veya std::unordered_multimap'u kullanabilirsiniz.

+0

@Anton_Savin Cevabınız için teşekkürler. Şu an için multimaps'lardan kaçınmam gerekiyor ve bunun yerine normal unordered_map'ta bu problemi aşmanın bir yolunu arıyorum. Unordered_map'e her ekleme için arttırdığım int karşı değişkeni tutmak mantıklı olur ve sonra sayacı anahtar dizisine şöyle ekler: string fruit; meyve + = meyve + sayacı; my_map [fruit] = vec2; ? – user5482356

+0

@ user5482356: Görünüşe göre aptalca “kaçınmaya ihtiyaç var” şartı sizin öğretmeninizse, ilerlemenin iyi bir yolu, bir multimap'ın ekstra işlevselliğini kendiniz uygulamaktır. Yapması zor değil. –

1

2 öğe aynı tuşa sahipse, ilk anahtar değeri yazdırılır, diğerleri göz ardı edilir.

örnek parçacık:

Yani Harita Harita deneyin

std::multimap <int, xxx> stdBindListOuter; 
    std::multimap <int, std::string>::iterator pos; 
    std::multimap <int, xxx>::iterator posOuter; 

xxx -> .. kullanıcı tanımlı olabilir

bu tip kullanmak Yani daha esnek Davanız için versiyonlar. Sipariş edilen veya sırasız harita yerine ..

İlgili konular