DOMANDA [C++] Domanda su getline & Comprendere le documentazioni

Pubblicità
Grazie per la risposta, non conoscevo la libreria vector e ho scoperto il tipo "auto" che è veramente molto comodo ma sconsigliato al programmatore da quanto dicono le ricerche, inoltre lo "stile" del codice che non conoscevo, cioè il fatto che tu abbia messo un "cin >> tmp" nelle condizioni del while inizialmente mi ha confuso, poi non sono ancora riuscito a capire cos'è che rende falsa la condizione, ho solo notato che la variabile "max" arriva a -1 e (conseguentemente?) il ciclo si ferma...
Poi nei vettori, ".size" indica il numero di elementi occupati mentre ".capacity" tutto l'insieme degli elementi giusto?
Un altra cosa che non mi è chiara è il ciclo for finale:


for (const auto &i : vettore)

cout << "- " << i << "\n";



dichiari una costante di tipo auto (esiste un modo per vedere il tipo che assegna il compilatore in automatico?) che andando a tentativi mi sembra che sia sempre vector<string> giusto?
Poi inizializzi direttamente il suo indirizzo rendendolo uguale a quello di vettore? Non capisco la funzione del ":" in quel punto lì...

1. Ti consiglio di usare sempre vector. Soprattutto se stai imparando a programmare in C++. Lascia stare gli array in stile C che sono deprecati in C++(eccetto per alcuni casi molto rari).
2. auto è zucchero sintattico: lasci al compilatore il compito di dedurre il tipo. Perché è sconsigliato? O almeno, lo è per piccole dichiarazioni (e.g. int,double ecc.)
3. Il ciclo si ferma se
- La variabile arriva a 0 (= false)
- Lo stream di input diventa invalido. (spiegato su)
5. size() indica quanti elementi effettivamente ci sono. capacity() quanti elementi il contenitore può contenere prima di dover crescere nuovamente. Ti chiederai: perché? Efficienza. Spiegato ulteriormente qui.
6. Scusami se non ti ho detto cos'è: è un range-for. Brevemente, avrei potuto fare
for (size_t i = 0; i < vettore.size(); ++i)
cout ...
Tuttavia, come ti dissi precedentemente, in C++ tendiamo ad usare i range. I contenitori (come vector) ci permettono ciò:
for (vector<int>::iterator it = vettore.begin(); it != vettore.end(); ++it)
...
NB: vector<int>::iterator it è una dichiarazione lunghetta e pertanto è bene usare auto
for (auto it = vettore.begin(); ....)
Sui range si lavora tipicamente con gli iteratori. Quel range-for è nuovamente una semplificazione per
for (const auto& i = vettore.begin(); i != vettore.end(); ++i)

Chiaramente ti sto parlando a grossi termini, lascio lo studio a te, magari su un buon libro.
 
Pubblicità
Pubblicità
Indietro
Top