2013-02-25 8 views
5

CSV biçimli dosyaları ayrıştırmak için bir yineleyici gibi davranan bir sınıf yazdım. Ayrıca doğrudan bir MyObject yapısını doldurmak için belirli csv dosyalarını okumak için başka sınıflar yazdım.Biçimlendirilmiş bir akış üzerinde okumak için yineleyicileri kullanmak iyi bir şey mi?

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ı iyi çalışıyor ve onunla mutluyum ama örtük anlamı o (sadece kendim için gerçekleştirilen: o (kod parçasını hata işleme kaldırıldı) gibi Böylece sınıf kullanılabilir? Bir yineleyici o bir koleksiyon üzerinde yineleyicektir. Bu durumda koleksiyon yok ama bir akım var. bu zevk meselesi

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

mi:

böyle bir açık operatör >> aşırı yüklenerek i akışı kullanıyorum önermek formu ve böylece sahip bir şey tercih edilmelidir? Farklılıkların ne olduğunu açıkça göremiyorum (ikinci formda nesne doldurulduğu ve kopyalanmadığı hariç) ve ilk veya ikinci formun seçiminin sonuçları nelerdir.

Başka neden yerine bir çözüm kullandığımı tam olarak bilmek için başka fikirler almaktan mutluluk duyarım.

+0

Yineleyicilerin * koleksiyonlar üzerinde yinelemesi gerektiğini kim söylüyor *? Anlayışım, yineleyicilerin * bir şey üzerinde yinelemesi, * bir şeyin * herhangi bir veri türü ** olması, örneğin bir kap, bir akış (dosya, ağ verisi, ...) veya hatta bir kısmı (belki kukla) veri. Genel olarak tutun. ;) Iteratör tabanlı arayüzünüzü kişisel olarak seviyorum. – leemes

cevap

6

İsterseniz bir akışı bir koleksiyon olarak kullanabilirsiniz.

Ben, ancak, operator>> aşırı yüklenerek, her ikisine de sahip unutmayın ediyorum

- Açıkça tedavisinde std::istream_iterator<whatever> kullanarak bir koleksiyon olarak akışını davranabilirsiniz doğrudan operator>> kullanarak akışından veri okumak veya edebilirsiniz Bir koleksiyon olarak. Bu durumda, operator>>'u aşırı yüklemenin bariz bir seçim olduğunu düşünüyorum, o zamandan beri hiçbir şeyleri hiçbir şekilde fazladan işlerle tedavi edemezsiniz. Ayrıca, standart kitaplığa dahil edildiğinden, std::istream_iterator<x> kullanımı oldukça tanınabilir bir deyimdir.

2

Yineleme kavramı, kapsayıcılarınkine bağlı değildir. Yineleyiciler, bir değerler dizisi üzerinde yineleme yapar. Farklı yineleyici tasarımları diziyi farklı yollarla tanımlar, ancak daima geçerli değer fikirleri vardır, ilerler ve sona ulaşır. Girdi yineleyicileriyle ilgili tek sorun, dosya sonunda yalnızca sonlandırmalarıdır; Örneğin, sonraki 10 satırın olduğunu söyleyemezsiniz, çiftler içerir ve sonra 'a başka bir şey yaparız. (Ancak, akışı algılamak için akışa bir streambuf ekleyebilirsiniz.)

İlgili konular