in C++ 11 se abbiamo un set<int> S
; potremmo dire:range-based per in C++ 11
for (auto i: S)
cout << i << endl;
ma possiamo costringere i
essere un iteratore, intendo scrivere un codice che è equivalente a:
for (auto i = S.begin(); i != S.end(); i++)
cout << (i != s.begin()) ? " " : "" << *i;
o potremmo fare qualcosa che possiamo capire l'indice di i
nel set (o vettore)?
e un'altra domanda è come potremmo dire che non lo facciamo per tutti gli elementi in S
ma per la prima metà di loro o tutti, tranne il primo.
o quando abbiamo un vector<int> V
e vogliamo stampare i suoi primi valori n
cosa dovremmo fare? So che possiamo creare un nuovo vettore ma ci vuole tempo per copiare un vettore in un nuovo vettore.
Ho chiesto una domanda simillar qui: http://stackoverflow.com/questions/8960403/get-first-n-elements-in-ac-multiset (per multiset invece) – Cristy
Per stampare il primo n valori di un 'vector':' for (auto val: vec | sliced (0, n)) {...} '. Vedi ['sliced', da Boost.Range] (http://www.boost.org/doc/libs/release/libs/range/doc/html/range/reference/adaptors/reference/sliced.html). –
Lo scopo del 'for' basato sulla gamma è quello di essere in grado di iterare più facilmente su un intero intervallo. Lo scopo è * non * sostituire completamente non-range 'for'. Ci sono cose per le quali hai bisogno di regolare 'for'; la gamma 'for' è solo zucchero sintattico per un modello di iterazione comune. Non coprirà tutto e non dovrebbe. –