2013-04-07 18 views
14

unordered_set<Interval> yapmak için aşağıdaki kodu kullanıyorum. Bu iyi derler. Bu kodu kullanarak eklemeye çalıştığınızdaÖzel hash işleviyle unordered_set içine ekleme

struct Interval { 
    unsigned int begin; 
    unsigned int end; 
    bool updated; //true if concat. initially false 
    int patternIndex; //pattern index. valid for single pattern 
    int proteinIndex; //protein index. for retrieving the pattern 
}; 

struct Hash { 
    size_t operator()(const Interval &interval); 
}; 


size_t Hash::operator()(const Interval &interval){ 
    string temp = to_string(interval.begin) + to_string(interval.end) + to_string(interval.proteinIndex); 
    return hash<string>()(temp); 
} 

unordered_set<Interval, string, Hash> test; 

Ancak, ben derleme olamaz:

for(list<Interval>::iterator i = concat.begin(); i != concat.end(); ++i){ 
    test.insert((*i)); 
    } 

Üstelik ben sorun hata mesajlarından ne belirleyemiyor. Ben sadece 1 argüman sağlanan düşünce

note: candidate is: 
note: size_t Hash::operator()(const Interval&) 
note: candidate expects 1 argument, 2 provided 

...

kimse benim yerleştirme kodu ile ilgili bir sorun görüyor mu: Burada

bir örnektir? Lütfen yardım edin, eğer yapabilirseniz - uzun zamandır bir çözüm arıyorum.

DÜZENLEME:

İşte yeni örnekleme kod: unordered_set<Interval, Hash> test; Ancak, ben yine de hata iletileri ile ilgili bir takım alıyorum. Ör:

note: candidate is: 
note: size_t Hash::operator()(const Interval&) <near match> 
note: no known conversion for implicit ‘this’ parameter from ‘const Hash*’ to ‘Hash*’ 
+0

Cevabımı güncelledim, bu sizin düzeninizde anlattığınız sorunu çözmelidir –

+0

http://stackoverflow.com/questions/17016175/c-unordered-map-using-a-custom-class-type-as- Anahtar kelime –

cevap

25

İlk sorun: Sen unordered_set<> sınıf şablon için örneklemek için ikinci şablon bağımsız değişken olarak string geçiyoruz

. The second argument should be the type of your hasher functor ve std::string, değiştirilebilir bir nesne değil.

Belki yazmak istedim: o C++ Standart Kütüphanesinin algoritmaların isimleri beri

unordered_set<Interval, /* string */ Hash> test; 
//      ^^^^^^^^^^^^ 
//      Why this? 

Ayrıca, ben, senin (üye) değişkenler için begin ve end dışındaki isimler kullanarak öneririm.

İkinci sorun:

Aklında, that the hasher function should be qualified as const tutmalı

, bu nedenle funktor olmalıdır:

struct Hash { 
    size_t operator() (const Interval &interval) const { 
    //           ^^^^^ 
    //           Don't forget this! 
    string temp = to_string(interval.b) + 
        to_string(interval.e) + 
        to_string(interval.proteinIndex); 
    return (temp.length()); 
    } 
}; 

Üçüncü sorun: Nihayet

, sen std::unordered_set istiyorsanız Interval tipindeki nesnelerle çalışabilmek için, hashınızla tutarlı bir eşitlik operatörü tanımlamanız gerekir işlevi. Varsayılan olarak, std::unordered_set sınıf şablonunun üçüncü parametresi olarak herhangi bir tür bağımsız değişken belirtmezseniz, operator == kullanılacaktır.

Şu anda Interval sınıfınız için operator == aşırı yükünüz yok, bu nedenle bir tane sağlamalısınız.Örneğin:

inline bool operator == (Interval const& lhs, Interval const& rhs) 
{ 
    return (lhs.b == rhs.b) && 
      (lhs.e == rhs.e) && 
      (lhs.proteinIndex == rhs.proteinIndex); 
} 

Sonuç:

her şeyden değişiklikler sonra, kod bu live example içinde derleme görebilirsiniz.

+0

Anladım. Yardım için teşekkürler! – user2052561

+0

@ user2052561: Cevabı daha fazla düzeltmek için güncelledim –

+0

Wow! Çok teşekkürler. Bu benim ilk kez 'unordered_set's kullanarak oldu ... – user2052561

İlgili konular