2013-02-21 17 views
11

Tôi muốn có lời khuyên của bạn về việc sử dụng BOOST_FOREACH.BOOST_FOREACH so với vòng lặp

Tôi đã đọc xung quanh nó không thực sự được đề nghị về hiệu suất là một tiêu đề rất nặng. Hơn nữa, nó buộc sử dụng câu lệnh "break" và "continue" vì bạn không thể thực sự có điều kiện thoát do Boolean điều khiển và tôi luôn được thông báo rằng "break" và "continue" nên tránh khi có thể.

Tất nhiên những lợi thế là bạn không giao dịch trực tiếp với trình vòng lặp giúp dễ dàng thực hiện nhiệm vụ lặp qua vùng chứa.

Bạn nghĩ sao về điều này? Bạn có nghĩ rằng nếu sử dụng nó nên được thông qua một cách có hệ thống để đảm bảo tính đồng nhất trong một dự án hoặc việc sử dụng nó chỉ được khuyến nghị trong một số trường hợp nhất định?

+4

"và tôi luôn được thông báo rằng" nghỉ "và" tiếp tục "nên tránh khi có thể." Bạn có thể làm tròn không? – utnapistim

+8

IIRC Có những lý do để tránh phá vỡ và tiếp tục trở lại vào những ngày cũ tốt nơi mọi người không có mẫu RAII và optmimizers có thể gặp rắc rối khi vòng lặp sẽ quá "nhảy". Đó là những ngày của giáo điều "một lối ra duy nhất", trong đó các hàm chỉ có một câu lệnh trả về, tấn của if và một số goto.Và có những người đã học những con chó đó trước đây, không bao giờ nghi ngờ họ và đang truyền bá chúng cho những người trẻ trong những thời điểm mà họ không có ý nghĩa gì nhưng lại gặp rất nhiều rắc rối. –

+0

Trong khi tôi đồng ý với bạn, tôi phải nói rằng có thể có giá trị trong việc không sử dụng ngắt hoặc tiếp tục cho các vòng lặp. Nếu bạn đặt trước các từ khóa đó và đồng ý không sử dụng chúng trong vòng lặp, thì ý định trở nên rõ ràng hơn. Nhưng điều này chỉ là quá nhiều IMHO, tôi sẽ không tư vấn cho nó. – MatiasFG

Trả lời

18

Tôi có thể nói các vòng lặp dựa trên C++ sẽ vượt qua nó. Số này tương đương với this BOOST_FOREACH example:

std::string hello("Hello, world!"); 
for (auto c : hello) 
{ 
    std::cout << c; 
} 

Tôi chưa bao giờ thấy mình cần sử dụng nó trong ++ 03.

Note khi sử dụng vòng lặp dựa nhiều trên container với tốn kém để sao chép các yếu tố, hoặc trong một bối cảnh chung, cách tốt nhất là sử dụng const& đến những yếu tố:

SomeContainerType<SomeType> v = ....; 
for (const auto& elem : v) 
{ 
    std::cout << elem << " "; 
} 

Tương tự, nếu bạn định nghĩa để sửa đổi các phần tử của vùng chứa, sử dụng không phải là & (auto& elem : v).

+0

Tôi nghĩ bạn nên sử dụng [const] tự động và hầu hết thời gian - nếu không bạn sẽ nhận được bản sao – Daniel

+0

mô tả chi tiết hơn: http://msdn.microsoft.com/en-us/library/vstudio/dd293667.aspx (Tham khảo và cv -qualifiers) – Daniel

+0

@Daniel có, nhưng trong trường hợp của anh ta chúng ta có 'char', và tôi đã cố gắng viết tương đương với ví dụ 'BOOST_FOREACH'. – juanchopanza

7

Trong chương trình, sự rõ ràng là át chủ bài. Tôi đã luôn luôn sử dụng thúc đẩy foreach trong C + + 03, thấy nó dễ đọc hơn nhiều so với vòng viết tay, kích thước tiêu đề sẽ không giết bạn. Như @juanchopanza đúng lưu ý, tất nhiên, câu hỏi này đã lỗi thời trong C++ 11.

Mối quan tâm của bạn với sự cố và tiếp tục không có cơ sở và có thể phản tác dụng. Với các tiêu đề lặp for-loop truyền thống của C++ 03, mọi người có xu hướng không phải là đọc tiêu đề vòng lặp và bỏ qua bất kỳ biến điều kiện nào ẩn trong tiêu đề vòng lặp. Tốt hơn hãy làm cho mục đích của bạn rõ ràng bằng cách ngắt và tiếp tục.

Nếu bạn đã quyết định sử dụng tăng cường foreach, hãy sử dụng nó một cách có hệ thống. Nó được cho là được sử dụng để thay thế các vòng bánh mì và bơ.

0

Tôi vừa thay thế sử dụng BOOST_FOREACH bằng vòng lặp đơn giản và tăng tốc 50%, vì vậy tôi sẽ nói chắc chắn đây không phải là điều tốt nhất để sử dụng. Bạn cũng sẽ không nhận được bộ đếm vòng lặp (ví dụ: "i") mà đôi khi bạn thực sự cần. Cá nhân tôi không phải là fan nhưng YMMV nếu nó phù hợp với phong cách của bạn tốt hơn.

BTW - một "tiêu đề nặng" sẽ không ảnh hưởng đến hiệu suất chương trình của bạn, chỉ có thời gian biên dịch.