This SO question phát ra một cuộc thảo luận về std::generate
và các đảm bảo được thực hiện theo tiêu chuẩn. Cụ thể, bạn có thể sử dụng đối tượng chức năng với trạng thái nội bộ và dựa trên generate(it1, it2, gen)
để gọi gen()
, lưu trữ kết quả trong *it
, gọi lại gen()
một lần nữa, lưu trữ trong *(it + 1)
v.v ... hoặc có thể bắt đầu ở mặt sau chẳng hạn?Từ ngữ chuẩn C++: Có "thông qua tất cả các trình vòng lặp trong phạm vi" ngụ ý tuần tự không?
Tiêu chuẩn (n3337, §25.3.7/1) nói điều này:
Effects: Các thuật toán đầu tiên gọi hàm đối tượng
gen
và gán giá trị trả về của gen qua tất cả các vòng lặp trong phạm vi[first,last)
. Thuật toán thứ hai gọi gen đối tượng hàm và gán giá trị trả về của gen thông qua tất cả các vòng lặp trong phạm vi[first,first + n)
nếun
là tích cực, nếu không nó sẽ không làm gì cả.
Nó có vẻ như không có trật tự được đảm bảo, đặc biệt là từ các khoản khác có từ ngữ mạnh mẽ hơn, ví dụ std::for_each
(Effects: Áp dụng f
đến kết quả của dereferencing mỗi iterator trong khoảng [first,last)
, bắt đầu từ đầu và tiến tới last - 1
Nếu chúng tôi đang thực hiện điều này theo nghĩa đen, nó chỉ đảm bảo bắt đầu tại first
và kết thúc tại last
mặc dù - không đảm bảo về thứ tự ở giữa).
Nhưng: Cả hai Microsoft's và Apache's C++ standard library đều cung cấp ví dụ trên trang tài liệu yêu cầu đánh giá tuần tự. Và cả hai libC++ (trong algorithm
) và libstdC++ (trong bits/stl_algo.h
) thực hiện nó theo cách đó. Hơn nữa, bạn mất rất nhiều ứng dụng tiềm năng cho generate
mà không cần đảm bảo này.
Từ ngữ hiện tại có ngụ ý tuần tự không? Nếu không, đây có phải là sự giám sát của các thành viên của ủy ban hay cố tình không?
(Tôi biết rằng không có nhiều người có thể cung cấp câu trả lời sâu sắc cho câu hỏi này mà không chỉ suy đoán hoặc thảo luận, nhưng theo quan điểm khiêm tốn của tôi, điều này không làm cho câu hỏi này 'không mang tính xây dựng' theo hướng dẫn SO .)
Nhờ @juanchopanza chỉ ra vấn đề này và giới thiệu tôi đến đoạn khoảng for_each
.
Tôi không nghĩ rằng 'generate()' là rất hữu ích nếu nó không phải tuần tự. –
Tôi tin rằng sự mơ hồ được nâng lên đáng kể khi được đưa vào ngữ cảnh của lớp lặp * yêu cầu * chức năng mẫu yêu cầu nó được cung cấp; ** 'mẫu' **. Vì cả đầu tiên và cuối cùng chỉ là yêu cầu chuyển tiếp, hãy lưu để xếp tất cả chúng vào một mảng hoặc cấu trúc vectơ, sau đó nhảy không tuần tự về chuỗi, bạn có ít lựa chọn nhưng bắt đầu từ đầu và đến cuối. –
WhozCraig
@WhozCraig Heh, tôi hoàn toàn bỏ lỡ điều đó. Theo tôi, đây là một câu trả lời sâu sắc và bạn nên đăng nó như vậy. Tuy nhiên, tôi vẫn muốn nghe từ những người gần gũi với ủy ban hoặc những người triển khai thư viện về những suy nghĩ của họ về điều này. – us2012