Luôn sử dụng biến thể mô tả tốt nhất những gì bạn định làm. Đó là
Đối với mỗi yếu tố x
trong vec
, làm bar.process(x)
.
Bây giờ, hãy xem xét các ví dụ:
std::for_each(vec.begin(), vec.end(),
std::bind1st(std::mem_fun_ref(&Bar::process), bar));
Chúng tôi cũng có một cái for_each
đó - yippeh . Chúng tôi có [begin; end)
phạm vi chúng tôi muốn hoạt động.
Về nguyên tắc, thuật toán rõ ràng hơn nhiều và do đó thích hợp hơn bất kỳ triển khai viết tay nào. Nhưng sau đó ... Chất kết dính? Memfun? Về cơ bản C ++ interna làm thế nào để có được chức năng thành viên? Đối với nhiệm vụ của tôi, tôi không quan tâm đến họ! Tôi cũng không muốn phải chịu đựng cú pháp dài dòng, rùng rợn này.
Bây giờ khả năng khác:
for (std::vector<Foo>::const_iterator it = vec.begin(); it != vec.end(); ++it)
{
bar.process(*it);
}
Cấp, đây là một mô hình phổ biến để nhận ra, nhưng ... tạo các vòng lặp, lặp, tăng, khử hội nghị. Đây cũng là tất cả những điều tôi không quan tâm để hoàn thành nhiệm vụ của mình.
Phải thừa nhận rằng, có vẻ waay tốt hơn so với các giải pháp đầu tiên (ít nhất, vòng cơ thể linh hoạt và khá rõ ràng), nhưng vẫn còn, nó không phải là thực sự là tuyệt vời. Chúng tôi sẽ sử dụng cái này nếu chúng tôi không có khả năng tốt hơn, nhưng có lẽ chúng tôi có ...
Một cách tốt hơn?
Bây giờ trở lại for_each
. Sẽ không tuyệt vời khi nói theo nghĩa đen for_each
và linh hoạt trong hoạt động sẽ được thực hiện, quá? May mắn thay, vì C ++ 0x lambdas, chúng tôi
for_each(v.begin(), v.end(), [&](const Foo& x) { bar.process(x); })
Bây giờ chúng tôi đã tìm thấy một giải pháp chung chung, trừu tượng cho nhiều tình huống liên quan, đáng chú ý là trong trường hợp cụ thể này, có một yêu thích tuyệt đối số 1 :
foreach(const Foo& x, vec) bar.process(x);
Nó thực sự không thể nhận được rõ ràng hơn nhiều. Rất may, C ++ 0x get của một cú pháp tương tự built-in !
map(bar.process, vec)
mặc dù bản đồ cho các tác dụng phụ không được khuyến khích và các biểu thức hiểu / trình tạo danh sách được khuyến nghị trên bản đồ).