Cá nhân tôi, đọc đầu tiên của tôi về:
std::generate(numbers.begin(), numbers.end(), rand);
là "chúng tôi đang gán cho mọi thứ trong một phạm vi. Phạm vi là numbers
. Các giá trị được chỉ định là ngẫu nhiên".
Đọc đầu tiên của tôi về:
for (int& x : numbers) x = rand()
là "chúng tôi đang làm điều gì đó với mọi thứ trong một phạm vi. Phạm vi là numbers
. Những gì chúng tôi làm là chỉ định một giá trị ngẫu nhiên."
Chúng khá giống nhau, nhưng không giống nhau. Một lý do hợp lý mà tôi có thể muốn kích động lần đọc đầu tiên, là bởi vì tôi nghĩ sự thật quan trọng nhất về mã này là nó gán cho phạm vi. Vì vậy, có "tại sao tôi muốn ..." của bạn. Tôi sử dụng generate
vì trong C ++ std::generate
có nghĩa là "gán phạm vi". Như btw std::copy
, sự khác biệt giữa hai là những gì bạn chỉ định từ.
Tuy nhiên, có những yếu tố gây nhiễu. Các vòng lặp for dựa trên phạm vi có cách thể hiện trực tiếp hơn về phạm vi đó numbers
, so với các thuật toán dựa trên trình lặp. Đó là lý do tại sao mọi người làm việc trên các thư viện thuật toán dựa trên phạm vi: boost::range::generate(numbers, rand);
trông đẹp hơn std::generate
phiên bản.
Ngược lại, int&
trong vòng lặp for dựa trên phạm vi của bạn là một nếp nhăn. Điều gì sẽ xảy ra nếu kiểu giá trị của phạm vi không phải là int
, thì chúng ta đang làm một điều gì đó rất tinh vi ở đây phụ thuộc vào việc nó có thể chuyển đổi thành int&
, trong khi generate
mã chỉ phụ thuộc vào kết quả trả về từ rand
việc có thể gán cho phần tử. Ngay cả khi loại giá trị là int
, tôi vẫn có thể dừng lại để suy nghĩ xem nó có hay không. Do đó auto
, điều này làm giảm suy nghĩ về các loại cho đến khi tôi thấy những gì được chỉ định - với auto &x
tôi nói "tham chiếu đến phần tử phạm vi, bất kỳ loại nào có thể có". Trở lại trong C ++ 03, các thuật toán (vì họ chức năng đang templates) là những cách để ẩn các loại chính xác, bây giờ họ đang một chiều.
Tôi nghĩ rằng các thuật toán đơn giản nhất chỉ có lợi ích biên so với các vòng lặp tương đương. Các vòng lặp dựa trên phạm vi cải thiện các vòng lặp (chủ yếu bằng cách loại bỏ hầu hết các bản ghi sẵn, mặc dù có nhiều hơn một chút đối với chúng). Vì vậy, lợi nhuận thu hẹp hơn và có lẽ bạn thay đổi ý định trong một số trường hợp cụ thể. Nhưng vẫn có một sự khác biệt về phong cách ở đó.