Vì vậy, khi chúng ta cần phải đi qua một container từ đầu đến cuối, chúng tôi viết một cái gì đó giống nhưLàm cách nào để kết thúc() được triển khai trong các vùng chứa STL?
for (i = v->begin(); i != v->end(); i++)
giả i
là một iterator cho container v
.
Câu hỏi của tôi là "điều gì đảm bảo rằng kết thúc sẽ luôn trỏ đến một phần tử cuối cùng trong vùng chứa?" STL đảm bảo hành vi này như thế nào và có khả năng là trường hợp này không đúng không?
STL không đảm bảo hành vi này. STL ** thực hiện ** hành vi này dựa trên các yêu cầu được xác định bởi tiêu chuẩn. Tiêu chuẩn nói đây là cách nó được cho là làm việc với nhà phát triển thực hiện STL sau đó được yêu cầu làm cho STL hoạt động chính xác. –
Đó không phải là cách thực hành tốt nhất. Ưu tiên toán tử tăng trướC++ i thay vì i ++ khi bạn không lưu trữ giá trị. Đối với nhiều loại, nó nhanh hơn. –
@Jive Dadson: đó không phải là mối quan tâm chính của tôi -> recomputing 'v-> end()' ở mỗi lượt của vòng lặp chắc chắn là kém hiệu quả ... 'cho (auto it = v.begin(), end = v .end(); it! = end; ++ it) 'là dạng kinh điển, mặc dù trong C++ 0x ta cũng có thể dùng' for (auto val: v) 'hoặc' std :: foreach' và lambda chức năng. –