Possiamo usare una class definita dall’utente per la chiave in una mappa STL?

Ho bisogno di una chiave sulla mappa, tuttavia, ho trovato che dovrebbe essere più dati. Posso inserire questi dati in una class definita dall’utente e inserire l’intera class come chiave nella mappa?

Influirà sull’efficienza temporale?

Quali altre preoccupazioni dovrebbero essere applicate qui?

Qualsiasi tipo può essere utilizzato come chiave finché è

  • copiabile
  • Assegnabile
  • Comparabile, poiché la mappa è ordinata per chiave

Se la tua class è solo una struttura semplice, è già copiabile e assegnabile. Affinché una class sia comparabile, è necessario implementare l’ operator< o creare la mappa con una funzione di confronto personalizzata da utilizzare.

L'unico impatto sull'efficienza temporale viene dagli oggetti più grandi che impiegano più tempo a copiare e confrontare. Se gli oggetti devono essere di quelle dimensioni, non c'è nulla che tu possa fare al riguardo, quindi non preoccuparti.

Finché quella class ha un operator< (o comunque rende le sue istanze < -comparabili, ad esempio definendo un operator< che può accettare due istanze come argomenti in un modo o nell'altro - o, ancora, si crea la mappa con un object di confronto esplicito), funzionerà correttamente. Sarà veloce se e solo se quell'operatore o funzione (e altri bit cruciali come il suo costruttore di copie) sono, ovviamente.

Modifica : aggiunto il bit in più che l' operator< (se è quello che si desidera utilizzare piuttosto che fornire un object di confronto esplicito) non deve essere un operatore, ma potrebbe essere una funzione separata - da tx a @Neil per indicarlo in un commento .

Un tipo da utilizzare come tipo di chiave di una mappa deve avere una specializzazione std::less o un altro predicato (invece dello std::less ) passato alla mappa. L’implementazione predefinita di std::less uses < . Così puoi

  1. overload operator<() per il tuo tipo
  2. specializza std::less per questo
  3. passare un predicato diverso a std::map .

Sì, è ansible utilizzare qualsiasi class come chiave purché implementi l’operatore minore di

Non preoccuparti del tempo a meno che non si riveli un problema nella pratica.

Per quanto riguarda l’utilizzo di classi definite dall’utente per le chiavi, sicuro. A causa del modo in cui è definita la mappa, è necessario definire un operatore “minore di” (operatore <) per la classe o fornire un oggetto comparatore durante la costruzione della mappa. Ecco un esempio di quest'ultimo.

Per quanto riguarda l’efficienza, non preoccuparti prematuramente, ma una preoccupazione è quanto sia costoso fare copie dell’object chiave.

Non si tratta di efficienza, ma di evitare di alterare il contenuto delle chiavi in ​​modo da influenzare il risultato dell’operatore

Se ti interessa l’indicizzazione efficiente con i diversi componenti della chiave (dal momento che dici che sono “dati multipli”, guarda boost :: multi_index .

Certo che puoi, devi solo sovraccaricare l’operatore “<" per impostare una chiave definita dall'utente. Un esempio:

 struct x { int t; bool operator<(const x &a) const { return (this->t < at); } }; int main() { xp={10}, q={11}, r={12}; map m; m[p]=1; m[q]=2; m[r]=3; for(auto w: m) cout<