2012-01-15 62 views
12

Sự khác nhau giữa các trình lặp đầu vào và các trình vòng lặp chuyển tiếp chỉ đọc là gì?Sự khác nhau giữa các trình lặp đầu vào và các trình vòng lặp chuyển tiếp chỉ đọc là gì?

Bởi vì sau này là chỉ đọc, rõ ràng là chúng không đáp ứng các yêu cầu của bộ lặp đầu ra. Và, vì lý do đó, chúng có hiệu quả đầu vào vòng lặp với bảo đảm bổ sung (nếu có). Vấn đề là, những gì bổ sung đảm bảo?

Dự đoán của tôi sẽ là các trình vòng lặp chuyển tiếp là các trình lặp đa vòng và đầu vào không đúng, tôi có đúng không?

Trả lời

20

Có, bộ lặp đầu vào là trình lặp vòng một lần. Bạn chỉ có thể lặp qua chúng một lần, trong khi các trình vòng lặp chuyển tiếp là đa-pass.

Từ §24.2.3 [input.iterators] p2 (the table), cột trước/hậu của ++r:

trước: r là dereferenceable.
bài đăng: r là không thể chấp nhận được hoặc r là kết thúc.
bài đăng: bất kỳ bản sao nào của giá trị trước đó của r không còn bắt buộc có thể bị hủy đăng ký hoặc nằm trong miền ==.

Các hậu điều cuối cùng ngụ ý rằng cho a == b, ++a == ++b là không bắt buộc phải true.
Same khoản, khoản 3:

[Lưu ý: Đối với lặp đầu vào, a == b không bao hàm ++ a == ++ b. (Bình đẳng không đảm bảo tính chất thay thế hoặc tính minh bạch tham chiếu.) Các thuật toán trên các trình vòng lặp đầu vào sẽ không bao giờ cố gắng đi qua cùng một trình lặp hai lần. Họ phải là một lượt là thuật toán. [...] Các thuật toán này có thể được sử dụng với istreams làm nguồn dữ liệu đầu vào thông qua mẫu lớp istream_iterator. -end lưu ý]

Từ §24.2.5 [forward.iterators]

p1 Một lớp hoặc con trỏ kiểu X đáp ứng các yêu cầu của một iterator về phía trước nếu

  • [...]
  • đối tượng loại X cung cấp bảo hành đa pass, được mô tả bên dưới.

p3 Hai lặp dereferenceable a và b của loại X cung cấp bảo lãnh đa-pass nếu:

  • a == b ngụ ý ++a == ++b
  • X là một loại con trỏ hoặc các biểu hiện (void)++X(a), *a tương đương với biểu thức *a.
+5

ví dụ điển hình Vì vậy, có thể là một dòng iterator (single-pass, đầu vào-iterator), và một danh sách đơn lẻ liên kết (multi-pass mong iterator) – jalf

+0

oh, bằng cách này, có một upboat. +1 – jalf

Các vấn đề liên quan