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)
và 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());
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
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