2009-09-03 24 views
6

Jestem nowy w C++ i STL. Siedzę z następującym prostym przykładzie hash set przechowywania struktur niestandardowych danych:proste C++ hash_set example

#include <iostream> 
#include <ext/hash_set> 

using namespace std; 
using namespace __gnu_cxx; 

struct trip { 
    int trip_id; 
    int delta_n; 
    int delta_secs; 

    trip(int trip_id, int delta_n, int delta_secs){ 
     this->trip_id = trip_id; 
     this->delta_n = delta_n; 
     this->delta_secs = delta_secs; 
    } 
}; 


struct hash_trip 
{ 
    size_t operator()(const trip t) 
    { 
     hash<int> H; 
     return H(t.trip_id); 
    } 
}; 

struct eq_trip 
{ 
    bool operator()(const trip t1, const trip t2) { 
     return (t1.trip_id==t2.trip_id) && 
     (t1.delta_n==t2.delta_n) && 
     (t1.delta_secs==t2.delta_secs); 
    } 
}; 

int main() 
{ 
    hash_set<trip, hash_trip, eq_trip> trips; 

    trip t = trip(3,2,-1); 
    trip t1 = trip(3,2,0); 

    trips.insert(t); 

} 

gdy próbuję go skompilować, pojawia się następujący komunikat o błędzie:

/usr/include/c++/4.2.1/ext/hashtable.h: In member function ‘size_t __gnu_cxx::hashtable<_Val, _Key, _HashFcn, _ExtractKey, _EqualKey, _Alloc>::_M_bkt_num_key(const _Key&, size_t) const [with _Val = trip, _Key = trip, _HashFcn = hash_trip, _ExtractKey = std::_Identity<trip>, _EqualKey = eq_trip, _Alloc = std::allocator<trip>]’: 
/usr/include/c++/4.2.1/ext/hashtable.h:599: instantiated from ‘size_t __gnu_cxx::hashtable<_Val, _Key, _HashFcn, _ExtractKey, _EqualKey, _Alloc>::_M_bkt_num(const _Val&, size_t) const [with _Val = trip, _Key = trip, _HashFcn = hash_trip, _ExtractKey = std::_Identity<trip>, _EqualKey = eq_trip, _Alloc = std::allocator<trip>]’ 
/usr/include/c++/4.2.1/ext/hashtable.h:1006: instantiated from ‘void __gnu_cxx::hashtable<_Val, _Key, _HashFcn, _ExtractKey, _EqualKey, _Alloc>::resize(size_t) [with _Val = trip, _Key = trip, _HashFcn = hash_trip, _ExtractKey = std::_Identity<trip>, _EqualKey = eq_trip, _Alloc = std::allocator<trip>]’ 
/usr/include/c++/4.2.1/ext/hashtable.h:437: instantiated from ‘std::pair<__gnu_cxx::_Hashtable_iterator<_Val, _Key, _HashFcn, _ExtractKey, _EqualKey, _Alloc>, bool> __gnu_cxx::hashtable<_Val, _Key, _HashFcn, _ExtractKey, _EqualKey, _Alloc>::insert_unique(const _Val&) [with _Val = trip, _Key = trip, _HashFcn = hash_trip, _ExtractKey = std::_Identity<trip>, _EqualKey = eq_trip, _Alloc = std::allocator<trip>]’ 
/usr/include/c++/4.2.1/ext/hash_set:197: instantiated from ‘std::pair<typename __gnu_cxx::hashtable<_Value, _Value, _HashFcn, std::_Identity<_Value>, _EqualKey, _Alloc>::const_iterator, bool> __gnu_cxx::hash_set<_Value, _HashFcn, _EqualKey, _Alloc>::insert(const typename __gnu_cxx::hashtable<_Value, _Value, _HashFcn, std::_Identity<_Value>, _EqualKey, _Alloc>::value_type&) [with _Value = trip, _HashFcn = hash_trip, _EqualKey = eq_trip, _Alloc = std::allocator<trip>]’ 
try.cpp:45: instantiated from here 
/usr/include/c++/4.2.1/ext/hashtable.h:595: error: passing ‘const hash_trip’ as ‘this’ argument of ‘size_t hash_trip::operator()(trip)’ discards qualifiers 

Co robię źle ?

Odpowiedz

8

Tak blisko! Ostatni błąd w wyjściu ujawnia rutynowe hash_trip powinny zostać uznane const:

size_t operator()(const trip t) const // note the ending 'const' 
{ 
    //... 
} 

Prawdopodobnie będziesz musiał zrobić to samo dla eq_trip. Również polecam przechodzącą argumenty do tych funkcji przez stałą odniesienia, aby uniknąć niepotrzebnych kopii danych jesteś przejazdem:

size_t operator()(const trip& t) const // note the '&' 
{ 
    //... 
} 
11

Należy zbadać za pomocą przedłużacza TR1 STL jest mianowicie

  • unordered_map
  • unordered_set
  • unordered_multimap
  • unordered_mutliset

Większość nowoczesnych C++ kompilatory statek z tych rozszerzeń, stąd nie ma potrzeby korzystania z niestandardowych klasy, takie jak hash_set itp

+0

Dzięki za sugestię. Zmieniłem TR1 na przenośność w systemie Windows z .NET Framework 3.5, ale kompilacja zwraca błąd "Can not open include file". – dzhelil

Powiązane problemy