2013-05-29 44 views
17

Khi lặp qua một QList<T> với vòng lặp foreach, trong các thử nghiệm tôi đã tiến hành các mục được trả về theo cùng thứ tự như với vòng lặp tiêu chuẩn for.Qt foreach vòng lặp đặt hàng so với vòng lặp cho QList

Câu hỏi của tôi là, foreach luôn trả lại các mục theo thứ tự số theo chỉ mục như thế này, đối với các vùng chứa có thứ tự tự nhiên (như QListQVector)? Ví dụ: sau đây luôn luôn tương đương?

QList<T> list; 

for(int i=0; i<list.count(); ++i) 
{ 
    // process items in numerical order by index 
    // do something with "list[i]"; 
} 

foreach(T item, list) 
{ 
    // will items always be processed in numerical order by index? 
    // do something with "item"; 
} 
+0

Bạn không thể sử dụng toán tử [i] trong danh sách, nhưng chỉ trong bảng (vectơ ...) để có một dấu ngẫu nhiên trên bộ nhớ. Hơn nữa, hãy thử C++ 11 foreac loop: (cho (T & item: list) {/ * một số mã * /}). Có thể điều này có thể giúp – Krozark

+0

@Krozark Nope, 'operator []' hoạt động tốt. Xem: http://qt-project.org/doc/qt-4.8/qlist.html#operator-5b-5d –

+0

@NikosC. Ok, nhưng không phải trong STL. Vì vậy, đối với vấn đề của bạn, hiệu quả nhất là sử dụng vòng lặp bằng cách sử dụng begin() và end() (tôi thực sự không biết macro foreach làm gì ...) – Krozark

Trả lời

27

Ví dụ: foreach macro (còn gọi là Q_FOREACH) sử dụng phương thức yêu cầu vòng lặp begin()end() trình lặp.

Vì vậy, nếu vùng chứa của bạn là QList hoặc QVector thì ví dụ của bạn sẽ luôn tương đương. Bạn có thể xem mã nguồn foreachhere.

Macro foreach không tuyệt vời, nó tạo bản sao của vùng chứa - vì vậy chỉ sử dụng trên các vùng chứa hỗ trợ chia sẻ ẩn. Sử dụng vòng lặp C++ 11 for(:) {} nếu có, nếu không Boost sẽ có mức tương đương cao hơn.

+0

Cảm ơn bạn! Điều này giúp rất nhiều! –

3

Dựa trên thông tin tìm thấy here, foreach là chậm hơn nhiều so với lần đầu tiên, cho thấy rằng nó không phải là tương đương.

+3

Bạn nói đúng, nhưng bạn chưa hiểu tại sao. Trong các thử nghiệm này, thử nghiệm 'foreach' đầu tiên * chậm hơn rất nhiều do việc tạo bản sao nông' QString' trên mỗi lần lặp lại, bằng cách sử dụng một tham chiếu const của dữ liệu vùng chứa thực tế đã làm cho thời gian trở lại gần giống như các bài kiểm tra khác vì nó bỏ qua bản sao nông. Ngược lại, việc sử dụng danh sách 'ints' sẽ có tác dụng tương tự. – cmannett85

Các vấn đề liên quan