Bir haritanın eşlenen değerini (anahtar yerine) aramak için C++ yolunun bir yolu var mı, sonra da anahtarı geri mi aldınız? Genellikle, değeri almak için someMap.find(someKey)->second
yapıyorum, ancak burada tam tersi yapmak ve anahtarı elde etmek istiyorum (değerler ve anahtarların tümü benzersizdir).Haritalı haritadaki değeri bul
cevap
map
'un nasıl tasarlandığından dolayı, sırasız veriler üzerinde yapılan bir aramanın eşdeğerini yapmanız gerekir.
for (it = someMap.begin(); it != someMap.end(); ++it)
if (it->second == someValue)
return it->first;
Aynı şey. Sadece işaretçiyi çağırmaktan vazgeçiyor ->. Muhtemelen tam olarak aynı koda derler. – Falmarri
Tam olarak ihtiyaç duyulan bu olabilir, ancak sadece bir yorum: "someValue" ile eşleşen tek bir harita olmayabilir ilk anahtarı döndürür. Daha sonra silinmiş veya değiştirilmiş olsa bile, sonraki aramada eşleşmeyecek, yinelemeden start() 'dan gereksiz şekilde yeniden başlatılması iyi değildir, ancak ilk yineleyici değeri bir işlev argümanı olarak iletilebilir. Umarım poster ortaya çıktıklarında böyle detaylar arayabilir. –
@Falmarri Aynı şeyi yaptığını biliyorum, sadece bunu yapmak için belirli bir neden olup olmadığını merak ediyorum. Görünüşe göre bu kod (ok) tuşu kadar güzel okunmuyor :) – wrongusername
Ne aradığınız bir Bimap ve Boost mevcut bunun bir uygulama vardır: http://www.boost.org/doc/libs/1_36_0/libs/bimap/doc/html/index.html
struct test_type
{
CString str;
int n;
};
bool Pred(std::pair< int, test_type > tt)
{
if(tt.second.n == 10)
return true;
return false;
}
std::map< int, test_type > temp_map;
for(int i = 0; i < 25; i++)
{
test_type tt;
tt.str.Format(_T("no : %d"), i);
tt.n = i;
temp_map[ i ] = tt;
}
auto iter = std::find_if(temp_map.begin(), temp_map.end(), Pred);
Lütfen kodla ilgili bir açıklama getirebilir misiniz? – rjdkolb
Biz anahtarlarına değerler eşleştiren bir reverseMap oluşturabilir.
gibi
map<key, value>::iterator it;
map<value, key> reverseMap;
for(it = originalMap.begin(); it != originalMap.end(); it++)
reverseMap[it->second] = it->first;
Bu aynı zamanda doğrusal arama gibi temelde ama sorguları bir dizi varsa yararlı olacaktır.
olası iki kopyası [Hem anahtar hem de değer ile arama yapmanın iyi bir yolu var mı?] (Http://stackoverflow.com/questions/3848483/is-there-a-good-way-to-search-by- her iki anahtar ve değer) –
@Fred: Bağlantılı soru hiçbir zaman bir yanıt almadı, yalnızca bir alternatif (bu özel gereksinimi karşıladığı görülüyordu, ancak konu bu değildi). –
Olası bir çoğaltılabilir [Kontrol değeri bir std :: harita - C++] var (http://stackoverflow.com/questions/535317/checking-value-exist-in-a-stdmap-c) – CharlesB