Theo hầu hết các tài liệu tham khảo C++, ví dụ cplusplus.com, forward iterators không bắt buộc phải được gán (ý tôi là, trì hoãn một giá trị). Tuy nhiên, đối với một số thuật toán STL rằng cần phải viết giá trị, ví dụ std::fill
(còn std::generate
vv), các đặc điểm kỹ thuật sử dụng mong iterator:STL điền và chuyển tiếp vòng lặp
template <class ForwardIterator, class T>
void fill (ForwardIterator first, ForwardIterator last, const T& val);
trong khi hành vi tương đương đòi hỏi dereference vế trái:
template <class ForwardIterator, class T>
void fill (ForwardIterator first, ForwardIterator last, const T& val)
{
while (first != last) {
*first = val;
++first;
}
}
Vì vậy, nó thực sự là sử dụng một iterator chuyển tiếp có thể thay đổi với một pass duy nhất.
Bây giờ câu hỏi là:
(1) Tại sao không làm cho nó rõ ràng rằng lặp về phía trước được sử dụng trong những trường hợp này là có thể thay đổi?
(2) Cập nhật: Tôi thấy câu hỏi sau là ngu ngốc: Tôi tạm thời quên rằng các trình vòng lặp đầu ra không cần hỗ trợ so sánh bình đẳng. Câu hỏi trên vẫn còn, anyway.
Tại sao sử dụng trình vòng lặp chuyển tiếp thay vì trình vòng lặp đầu ra cho std::fill
, std::generate
vv trong khi chúng không thực sự cần nhiều lần truyền? (std::copy
chỉ cần lặp đầu ra, ví dụ. Lý do là gì?)
'trình vòng lặp chuyển tiếp không bắt buộc phải gán ', làm cách nào bạn xác định điều đó? Tôi khá chắc chắn họ có thể chuyển nhượng được. –
@ JesseGood Với mục đích thực tế, chúng hầu như luôn được gán, nhưng nếu bạn đọc tài liệu tham khảo http://cplusplus.com/reference/iterator/ForwardIterator/?kw=forward%20iterator thì không. – 4ae1e1
@ JesseGood Tôi cũng tìm thấy điều này trên SO: http://stackoverflow.com/questions/14058642/are-forward-iterators-output-iterators – 4ae1e1