Domanda

Dato che non esiste alcuna funzione membro .resize () in C ++ std :: map, mi stavo chiedendo, come si possa ottenere una std :: map con al massimo n elementi.

La soluzione ovvia è creare un loop da 0 a n e utilizzare l'ennesimo iteratore come primo parametro per std :: erase ().

Mi chiedevo se esiste una soluzione che non ha bisogno del loop (almeno non nel mio codice utente) ed è più " il modo STL di andare " ;.

È stato utile?

Soluzione

Puoi usare std :: anticipo (iter, numberofsteps) per questo.

Altri suggerimenti

Soluzione universale per quasi tutti i container, come std :: list, std :: map, boost :: multi_index. Devi controllare solo le dimensioni della tua mappa.

template<class It>
It myadvance(It it, size_t n) {
   std::advance(it, n);
   return it;
}

template<class Cont>
void resize_container(Cont & cont, size_t n) {
    cont.erase(myadvance(cont.begin(), std::min(n, cont.size())), 
                 cont.end());
}

Il modo corretto per questo è usare std :: anticipo. Ma ecco un modo divertente (lento) che permette di "usare il ridimensionamento sulla mappa". Più in generale, questo tipo di trucco può essere utilizzato per altre cose che lavorano sul vettore ma non sulla mappa.

map<K,V> m; //your map
vector< pair<K,V> > v(m.begin(), m.end());
v.resize(n);
m = map<K,V>(v.begin(),v.end());

Una std :: map non è un elenco. Non ci sono " prime n " elementi.

A proposito: gli iteratori non sono validi se il contenitore viene modificato.

Se hai davvero bisogno di una mappa più piccola, puoi iterarla e aggiungere tutti gli elementi fino all'n-esima in una nuova mappa.

Perché dovresti voler ridimensionare una mappa?

Gli elementi in una mappa non sono memorizzati in nessun ordine - la prima 'n' non significa nulla

modifica:
È interessante notare che std :: map ha un ordine, non sono sicuro di quanto sia utile questo concetto.
Le voci sono nello stesso ordinamento delle chiavi?
Cosa significa? Se hai nomi codificati da SSN significa che i nomi sono memorizzati in ordine numerico SSN?

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