2013-02-25 12 views
5

Napisałem klasę, która działa jak iterator, aby parsować pliki w formacie CSV. Napisałem również inne klasy, aby odczytać konkretne pliki CSV, aby wypełnić bezpośrednio strukturę MyObject. W ten sposób klasa może być używana tak (usunąłem błąd obsługi część kodu):Czy warto używać iteratorów do czytania sformatowanego strumienia?

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 ... 
} 

program działa dobrze i jestem z niego zadowolony, ale uświadomiłem sobie, że niejawny znaczenia (tylko dla siebie?) iteratora jest to, że będzie iterować nad kolekcją. W tym przypadku nie ma kolekcji, ale strumień.

Wolałbym formularz, który wyraźnie sugerują używam strumień przeciążenia >> operatora a więc mający coś takiego:

std::ifstream in(filename); 
MyObjectReader reader(in); 
MyObject obj; 
while(reader >> obj) 
{ 
    // do the same "some stuff" here... 
} 

To tylko kwestia gustu? Nie widzę jasno, jakie są różnice (z wyjątkiem tego, że w drugiej formie obiekt jest po prostu wypełniony, a nie skopiowany) i jakie są konsekwencje wyboru pierwszej lub drugiej formy.

Chciałbym uzyskać inne opinie, aby dokładnie wiedzieć, dlaczego używam rozwiązania, a nie innego.

+0

Kto mówi, że iteratory powinny iterować po * kolekcjach *? Rozumiem, że iteratory iterują nad * czymś *, * czym * jest ** dowolnym rodzajem danych **, na przykład kontenerem, strumieniem (plik, dane sieciowe, ...) lub nawet niejawnym (może sztucznym) dane. Zachowaj to ogólne. ;) Osobiście lubię twój interfejs oparty na iteratorze. – leemes

Odpowiedz

6

Możesz traktować strumień jako kolekcję, jeśli chcesz.

Chciałbym jednak zauważyć, że przeciążenia operator>>, można mieć jedno i drugie - można wyraźnie odczytać dane ze strumienia przy użyciu operator>> bezpośrednio lub można traktować jako zbiór strumienia za pomocą std::istream_iterator<whatever> leczyć to jako kolekcja.

W tym przypadku wydaje mi się, że przeciążenie operator>> jest oczywistym wyborem, ponieważ wtedy można traktować wszystko w taki sposób, zasadniczo bez dodatkowej pracy. Ponadto używanie std::istream_iterator<x> jest dość rozpoznawalnym idiomem, ponieważ jest zawarty w standardowej bibliotece.

2

Pojęcie iteracji nie zależy od pojemników. Iteratory przechodzą przez sekwencję wartości. Różne projekty iteratorów definiują sekwencję na różne sposoby, ale zawsze jest zawsze idei bieżącej wartości, postępu i osiągnięcia końca. Jedynym problemem z wejściowymi iteratorami jest to, że kończą one tylko na końcu pliku; nie można na przykład powiedzieć, że następne 10 wierszy zawiera znaki podwójne, a następnie przechodzimy do innej rzeczy, . (Ale oczywiście można wstawić filtrowanie w strumieniu w celu wykrycia końca.)

Powiązane problemy