Domanda

Ho una std :: multimap in cui la chiave è una classe personalizzata. Qualcosa del genere:

Class X {
public:
    std::string s;
    int x;
    operator <(const X& other) const { return s < other.s; }
};
std::multimap<X, int> mymap;

Ora, vorrei usare upper_bound e lower_bound per iterare su tutti gli elementi con lo stesso valore di " s " ;. Devo implementare qualche altro operatore per X (ad esempio: ==). O funzionerà correttamente proprio così?

Inoltre, cosa devo fornire come argomento per upper_bound e lower_bound ? Presumo che dovrei creare un oggetto fittizio con il valore desiderato di & Quot; s & Quot ;?

È stato utile?

Soluzione

Poiché class X è la chiave per la multimappa, il parametro su upper_bound() / lower_bound() deve essere di quel tipo. Se std::string ha una conversione implicita da X::s (che è il tipo di less<>), puoi usarla come parametro in operator <() / <=>.

Il confronto predefinito per la multimap è <=> che chiama semplicemente <=>, quindi è l'unico operatore che devi avere in <=> per far funzionare la multimap.

Altri suggerimenti

devi solo fornire un operatore == e < ;.

upper_bound e lower_bound sono come qualsiasi altro metodo di tipo find, quindi hai bisogno dello stesso tipo di oggetto con cui confrontare - nel tuo caso, un oggetto 'fittizio' con il valore richiesto di s.

modifica : i commenti sono corretti e hai solo bisogno dell'operatore < per lower / upper_bound e find. Ma se si desidera chiamare altri metodi sul proprio contenitore, sarà necessario anche l'operatore ==. Per esempio. se vuoi ordinare () il tuo contenitore, avrai bisogno dell'operatore ==.

I 2 sovraccarichi necessari per tutti i contenitori STL sono l'operatore < e operatore ==. Trovo la sua migliore pratica per implementarli entrambi.

Ovviamente, alla domanda potrebbe anche essere data una risposta più completa implementando un funzione di confronto nella mappa stessa, senza fare affidamento sugli oggetti. Questo è spesso un buon modo per implementare diversi modi di chiamare find () sulla mappa.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top