2013-02-25 18 views
5

Tôi đã viết một lớp hoạt động như một trình lặp để phân tích các tệp được định dạng CSV. Tôi cũng đã viết các lớp khác để đọc các tệp csv cụ thể để điền trực tiếp cấu trúc MyObject. Vì vậy, các lớp có thể được sử dụng như thế (tôi loại bỏ các lỗi xử lý một phần của mã):là một điều tốt để sử dụng trình lặp để đọc trên luồng đã định dạng?

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

chương trình này hoạt động tốt và tôi hài lòng với nó, nhưng tôi nhận ra rằng ý nghĩa tiềm ẩn (chỉ dành cho bản thân mình?) của một trình lặp là nó sẽ lặp qua bộ sưu tập. Trong trường hợp này không có bộ sưu tập mà là một luồng.

Tôi có nên muốn có một hình thức mà một cách rõ ràng cho thấy tôi đang sử dụng một dòng do quá tải >> điều hành và do đó có một cái gì đó như thế:

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

Là nó chỉ là vấn đề của hương vị? Tôi không thấy rõ sự khác nhau (ngoại trừ ở dạng thứ hai đối tượng chỉ được điền và không được sao chép) và hậu quả của việc chọn hình thức đầu tiên hoặc thứ hai là gì.

Tôi rất vui khi nhận được một số ý kiến ​​khác để biết chính xác lý do tôi sử dụng giải pháp thay vì giải pháp khác.

+0

Ai nói rằng trình lặp nên lặp qua * bộ sưu tập *? Sự hiểu biết của tôi là các trình vòng lặp lặp qua * cái gì đó *, * cái gì đó * là ** bất kỳ loại dữ liệu nào **, ví dụ một thùng chứa, một luồng (tệp, dữ liệu mạng, ...) hoặc thậm chí một số ngầm định (có thể là giả) dữ liệu. Giữ nó chung. ;) Cá nhân tôi thích giao diện dựa trên trình lặp của bạn. – leemes

Trả lời

6

Bạn có thể coi luồng là tập hợp nếu muốn.

tôi muốn lưu ý, tuy nhiên, do quá tải operator>>, bạn có thể có cả hai - bạn có thể rõ ràng đọc dữ liệu từ các dòng sử dụng operator>> trực tiếp, hoặc bạn có thể đối xử với các dòng như một bộ sưu tập bằng cách sử dụng để điều trị std::istream_iterator<whatever> nó như một bộ sưu tập.

Đó là trường hợp, có vẻ như với tôi rằng quá tải operator>> là sự lựa chọn hiển nhiên, vì vậy bạn có thể xử lý mọi thứ theo cách cơ bản không có thêm công việc. Ngoài ra, việc sử dụng std::istream_iterator<x> là một thành ngữ khá dễ nhận biết, vì nó được bao gồm trong thư viện chuẩn.

2

Khái niệm lặp lại không phụ thuộc vào vùng chứa. Lặp đi lặp lại lặp qua một chuỗi các giá trị. Lặp lại khác nhau thiết kế xác định trình tự theo những cách khác nhau, nhưng có luôn là ý tưởng về giá trị hiện tại, trước và đến cuối. Về vấn đề duy nhất với vòng lặp đầu vào là chúng chỉ chấm dứt ở cuối tệp; bạn không thể nói, ví dụ, rằng 10 dòng tiếp theo có chứa gấp đôi, và sau đó chúng tôi đi đến cái gì khác. (Nhưng tất nhiên, bạn có thể chèn một luồng lọc vào luồng để phát hiện kết thúc.)