Ho scritto una classe che si comporta come un iteratore per analizzare file in formato CSV. Ho anche scritto altre classi per leggere file csv specifici per riempire direttamente una struttura MyObject. Così la classe può essere utilizzata come quello (ho rimosso la movimentazione parte del codice di errore):è una buona cosa usare gli iteratori per leggere su un flusso formattato?
std::ifstream in(filename);
MyObjectParser parser(in);
MyObjectParser::Iterator it;
for (it = parser.begin(); it != parser.end(); it++)
{
MyObject b = *it;
// do some stuff here ...
}
Il programma funziona bene e sono felice con lui, ma mi sono reso conto che il significato implicito (solo per me?) di un iteratore è che iterà su una collezione. In questo caso non esiste una raccolta ma un flusso.
Devo preferire una forma che suggerisco esplicitamente sto usando un flusso da sovraccarico operatore >> e avendo così qualcosa di simile:
std::ifstream in(filename);
MyObjectReader reader(in);
MyObject obj;
while(reader >> obj)
{
// do the same "some stuff" here...
}
E 'solo una questione di gusto? Non vedo chiaramente quali sono le differenze (eccetto che nella seconda forma l'oggetto è appena riempito e non copiato) e quali sono le conseguenze della scelta della prima o della seconda forma.
Sarei felice di avere altre opinioni per sapere esattamente perché sto usando una soluzione piuttosto che un'altra.
Chi dice che gli iteratori dovrebbero scorrere le * collezioni *? La mia comprensione è che gli iteratori iterano su * qualcosa *, * qualcosa * essendo ** qualsiasi tipo di dati **, ad esempio un contenitore, un flusso (file, dati di rete, ...) o anche alcuni impliciti (forse fittizi) dati. Mantieni generale. ;) Personalmente mi piace la tua interfaccia basata su iteratore. – leemes