Ho un problema di mettere i dati in un unordered_map utilizzando una struct come chiave:struct come chiave di unordered_map
typedef struct osdpi_flow_identificator {
u32 lower_ip;
u32 upper_ip;
u16 lower_port;
u16 upper_port;
u8 protocol;
} osdpi_flow_identificator_t;
// custom hash function for osdpi_flow_identificator
struct osdpi_flow_hash {
std::size_t operator() (osdpi_flow_identificator * key) const {
hash hash_function;
std::size_t returnValue =
hash_function(key->lower_ip)
+ hash_function(key->upper_ip)
+ hash_function(key->lower_port)
+ hash_function(key->upper_port)
+ hash_function(key->protocol);
printf(" calculated hash: %i\n", returnValue);
return returnValue;
}
};
typedef unordered_map <osdpi_flow_identificator*, osdpi_flow*, osdpi_flow_hash> osdpi_flows_hashmap;
typedef osdpi_flows_hashmap::value_type osdpi_flows_pair;
static osdpi_flows_hashmap osdpi_flows;
Il mio problema è che la funzione di hash restituisce lo stesso valore per osdpi_flow_identificators aventi lo stesso valore, ma
osdpi_flow_identificator * flow_id = new osdpi_flow_identificator;
osdpi_flows_hashmap::const_iterator iter;
iter = osdpi_flows.find(flow_id);
if (iter != osdpi_flows.end()) {
...
non lo trova, sebbene una voce con un flow_id che abbia esattamente gli stessi valori sia già nella mappa di hash. L'ho verificato, emettendo l'intera mappa di hash e anche la funzione di hash stampa lo stesso valore. Quindi è abbastanza difficile per me capire, perché unordered_map non riesce a trovare la voce con lo stesso hash.
Ho anche provato a sovraccaricare l'operatore == e l'operatore <, che a volte ho trovato come suggerimento nella rete, ma anche quelle funzioni non sono state chiamate.
Ciò che risolve il problema, ma, naturalmente, in seguito si conclude con un errore di segmentazione, è quello di lasciare flow_id non inizializzato - quindi la voce può essere trovata correttamente.
Qualsiasi aiuto è apprezzato!
Grazie Steffen
Questo è ovviamente sbagliato: typedef unordered_map osdpi_flows_hashmap; Potresti scrivere i parametri del modello giusto di unordered_map? – Scharron
Grazie, Scharron. Scusa .. meno/maggiore rispetto ai segni sono stati spogliati. Ora li abbiamo sostituiti con <e> – StephenKing
FYI, in primo luogo, viene chiamata la funzione di hash sulla chiave, quindi se alcuni oggetti esistono con lo stesso hash, viene chiamato l'operatore ==. L'operatore viene chiamato solo con std :: map (mappe ordinate). – Scharron