2012-01-09 29 views
26

Cách được khuyến nghị lặp lại vùng chứa trong C++ 11 là gì?Cách được khuyến nghị lặp lại vùng chứa trong C++ 11 là gì?

Sử dụng

container.begin() and container.end() 

Hoặc

begin(container) and end(container) 

Nếu bất kỳ, khi được một ưa thích hơn người kia?

+4

Ví dụ của bạn không liên quan gì đến việc lặp lại mỗi lần. Đó là về cách để có được vòng lặp từ một đối tượng của một lớp là một mô hình của container. – pmr

+5

Không có đủ kinh nghiệm để có cách thức được đề xuất. Cú pháp mới và các hàm miễn phí bắt đầu/kết thúc có lợi thế, nhưng có thể có những nhược điểm mà kinh nghiệm sẽ nói đến (tôi mong đợi không có, nhưng tôi không mong đợi hầu hết các giáo lý kinh nghiệm, ngay cả khi tôi mong đợi một số). – AProgrammer

Trả lời

24

Cách tốt hơn là

begin(container) 
end(container) 

vì nó mở rộng hơn. Ví dụ, khấu trừ đối số mẫu có thể được sử dụng để xác định kích thước của một mảng tĩnh và do đó begin(my_static_array)end(my_static_array) sẽ hoạt động.

Nói chung, bạn có thể thêm quá tải/chuyên môn để bắt đầu (.) Kết thúc (.) Và sử dụng các loại cũ không thay đổi trong thuật toán chung.

Bạn thực sự chỉ cần phải lo lắng về vấn đề này nếu bạn đang viết một thuật toán chung khỏang

template <typename T> 
void foo (T & t) 
{ 
    bar (begin(t), end(t)); // certainly better than bar(t.begin(), t.end()) 
} 

Trong mã client nó không quan trọng rất nhiều. Trong thực tế, tôi sẽ nói không sử dụng biểu mẫu mới trong trường hợp đó - Tôi muốn đặt trước một số kiểu/thành ngữ nhất định trong một số trường hợp nhất định, chia trí óc của tôi. Nhưng đó chỉ là tôi.

for (auto i = c.begin(); i != c.end(); ++i) 
    // I can see at-a-glance that c is a STL-style container. 
    // That might be useful to know. I can probably dismiss static arrays 
    // and unorthodox containers as possibilities. 
    foo (i, c.size()); 
+0

Tại sao phải tham chiếu đến một trình lặp ở đây? – Useless

+0

Vì tôi đã tranh giành với 'for (auto & i: c)', đã bị xóa ngay bây giờ. Cảm ơn. – spraff

+4

Nếu bạn muốn cho phép lặp qua một mảng, bạn phải viết 'std :: begin (t)' và 'std :: end (t)', hoặc bạn phải viết 'using std :: begin;' và 'using std :: end;' là hai câu lệnh đầu tiên bên trong hàm (giống như 'using std :: swap' thành ngữ). – fredoverflow

37

Tôi nghĩ rằng cú pháp mới với range based for loops

for (auto item : container) 

có lẽ là hầu hết C++ 11 thích.

Khi người khác nhận xét, đôi khi bạn muốn auto& hoặc const auto& thay vì auto.

+0

@Basile: Tôi đồng ý, nhưng VS10 không hỗ trợ điều đó vì vậy tôi chưa chơi với nó. :) –

+0

@spraff: Đồng ý, nhưng câu hỏi là (cố tình?) Mơ hồ, và câu trả lời của tôi phù hợp! –

+11

Tôi sẽ lấy các mục như là một tham chiếu: 'auto & item: container', để tránh các bản sao không cần thiết. – Xeo

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