2015-09-03 7 views
6

Sto iterando su una mappa C++. Dire che voglio ottenere le chiavi presenti nella mappa tranne il primo 2. Le chiavi sono ordinate sulla mappa. Quindi ho pensato di usare qualcosa di simile:Come eseguire iterazioni su un set specifico di chiavi in ​​mappe C++?

map<int, int> table; 
for(auto i = table.begin()+2; i != table.end(); i++) 
    cout<<i->first<<"\t"<<i->second<<endl; 

Anche se questo funziona con i vettori, si genera un errore con le mappe a causa l'operatore '+' non in corso di attuazione per le mappe. Un modo per ottenere il risultato è:

auto i = table.begin(); 
int count = 0; 
while(count < 2 && i != table.end()){ 
    count++; 
    i++; 
} 
for(; i!=table.end(); i++) 
    cout<<i->first<<"\t"<<i->second<<endl; 

Esiste un altro modo efficace per implementarlo?

+0

Sto avendo un po' di tempo a pensare duro di un caso d'uso per questo; sei sicuro che 'map' è la struttura dati giusta qui? 'map's in C++ capita di essere iterabile nell'ordine, ma le operazioni' map' che non possono essere fatte anche con 'unordered_map's mi fanno un po 'nausea, perché il punto di una' mappa' è * non * per essere una serie ordinata di tuple (che è più o meno ciò che 'priority_queue' è per) ma per essere una * mappatura * dalle chiavi ai valori. –

risposta

8

Non è più efficiente, ma forse un po 'più facile da leggere

for (auto i = std::next(table.begin(), 2); i != table.end(); i++) 
+0

in aumento perché questo sarà generalizzato ad altri contenitori, ad es. 'std :: vector' dove' std :: next' semplicemente delegherà a 'begin() + 2'. Due nitpicks: preferirei usare il nome 'it' e usare' i' per gli indici di loop, perché è meno sorprendente per le persone usate per i loop iterator basati su STL. Inoltre: preferisci '++ it' invece di' it ++ '. – TemplateRex

Problemi correlati