2012-10-05 32 views
6

değeri kullanarak eşleştirme anahtarı almak için nasıl, ben karşılık gelen kimliği bulmalıyız. Şimdiden çok teşekkürler!Ben sadece önceki kullanma değer türüne</p> <pre><code>map<int id, struct_t*> table struct_t { int prev; int wt; string name; } </code></pre> <p>olarak bir yapı ile bir harita var bir harita C++

DÜZENLEME: my harita verileri nasıl göründüğünü

int key=0; 
for(auto it = table.begin(); it != table.end(); ++it) 
{ 
    if(table[(*it).first].prev == ?) 
} 

budur: Her kimliği için

id prev abundance thing 
1573 -1  0  book 
1864 1573 39  beds 
2075 1864 41  tray 
1760 2075 46  cups 

, ben SONRAKİ eşleştirme kimliği bulmalıyız. Yani, 1573 için prev sütunundan 1864 olan bir 'id' eşleştirmesi bulmam gerekiyor. Ayrıca, std :: next çalışmıyor çünkü veri seti, bir sonraki öğede zorunlu olarak değil, aynı zamanda eşleşen bir iğe sahip olabilir. !

LÜTFEN LÜTFEN bana yardım edin! MY patron zaten C++ öğrenmek için çok fazla zaman alıyorum olmasından hayal kırıklığına uğradığını

+0

"Haritanın" anahtarı nedir? – hmjd

+0

veri türünü kastediyor musunuz? int id – snazziii

+3

Haritalar, değerlerinde değil, anahtarlarında aranmalıdır. Belki de tasarımınızı düzeltmeniz veya başka bir konteyner kullanmanız gerekir. – arnoo

cevap

5

olabilir modern bir derleyici çift yönlü harita artırmak, unutmayın eski bir derleyici ve örnek yerine bir sınıf sınıfını kullanmak için güncelleyebilirim. Tabii haritası üzerinde döngü

+0

Xcode kullanıyorum bu yüzden Apple LLVM 4.1 derleyicim var – snazziii

+0

Bunu gerçekten anlamıyorum .. Yapıma ihtiyacım yok, int olan anahtara ihtiyacım var. – snazziii

+0

Anahtar mı istiyorsun? Haritanızın geriye doğru olduğu anlaşılıyor ... Yukarıdaki kodda kolay bir değişiklik (sadece findResult-> ilkini kullanın). –

3

Basit döngü yapabilir (zaten yapılmış 3 hafta!):

Tabii
#include <map> 
#include <string> 
#include <iostream> 

int main() 
{ 
    std::map<int, std::string> m = { 
     std::make_pair(0, "zero"), std::make_pair(1, "one"), std::make_pair(2, "two") 
    }; 

    int key = 0; 
    for (auto &i : m) { 
     if (i.second == "two") { 
     key = i.first; 
     break; // to stop searching 
     } 
    } 

    std::cout << key << std::endl; 
} 

kendi ayarlamanız gerekir arama için if-cümlesi.

const int prevToFind = 10; 
auto findResult = std::find_if(std::begin(table), std::end(table), [&](const std::pair<int, struct_t*> &pair) 
{ 
    return pair.second->prev == prevToFind; 
}); 

int foundKey = 0; // You might want to initialise this to a value you know is invalid in your map 
struct_t *foundValue = nullptr 
if (findResult != std::end(table)) 
{ 
    foundKey = findResult->first; 
    foundValue = findResult->second; 

    // Now do something with the key or value! 
} 

varsa bana bildirin: , aşağıdakileri yapabilirsiniz Eğer var ise (lambdas destekler) bir çözelti (boost::bimap)

+0

Bu yüzden, yönettiğim yönü ekledim, ancak if ifadesinde neyi karşılaştırmam gerektiğini bilmiyorum! – snazziii

+0

'ı deneyin (i.second-> prev == the_id_youre_looking_for) ' – Hendrik

+0

Bu benim için kabul edilen cevaptan çok daha basit görünüyor. Bunun neden hiç oyu olmadığını anlamıyorum ... –

3

hüner yok, ancak bir endeks olarak ikinci bir harita kullanarak düşünebilirsiniz: Eğer table_idx yanı güncellemeniz gerekir

map<int,int> table_idx; 

Eğer table yenisini eklediğinde her prev'a karşılık gelen id'u saklamak. table_idx sonra (N) zaman günlüğüne id ters arama izin verir:

int prev_for_id = table_idx[id]; 
+0

Harita üzerinde döngü yaparak ne demek istiyorsun? – snazziii

+0

Yukarıdaki cevapların bazılarında benimsenen yaklaşıma atıfta bulunuyordum: 'prev' alanı, aradığınız 'id' değerine eşit olan değeri bulana kadar, haritadaki her girişi yineleyin. – Hendrik

1

Im yapmanız çalışıyoruz bize ne söylerseniz iyi olurdu böylece bir acemi bir his çünkü belki yanlış bir sorunu çözmeye çalışıyorsunuz.
Not ettiğiniz gibi haritalar, değer değil anahtar tarafından aranacak şekilde tasarlanmıştır.
Bu şekilde harita üzerinde arama yapmakta ısrar ederseniz, Boost Bimap'u kontrol etmek isteyeceksiniz.

+0

Evet, yeni başlayan biriyim. Bu projeyle 3 hafta boyunca mücadele ettim! – snazziii

+0

sorusunu güncelleyeceğim, sorununuzu anladım. Başımın üst kısmından önce tüm verileri bir haritaya koyardım (başlangıçta birimize edilmiş olan eklenmiş alanla birlikte). Sonra tüm haritadan geçebilirim ve her bir anahtar için value.prev == Y harita [Y] -> value.next = X – NoSenseEtAl

+0

Çalışmıyor ... X ve Y nedir? – snazziii