2009-08-24 22 views
7

Đối với các thùng chứa liên kết, toán tử ++ có thể gửi một trình lặp qua cuối bộ sưu tập không?Trình lặp của bản đồ STL có thể vượt quá giới hạn thông qua việc gia tăng không?

Ví dụ:

map<UINT32, UINT32> new_map; 
new_map[0] = 0; 
new_map[1] = 1; 

map<UINT32, UINT32> new_iter = new_map.begin(); 

++new_iter; 
++new_iter; 
++new_iter; 
++new_iter; 
++new_iter; 
++new_iter; 
++new_iter; 

Vào cuối này, không new_iter == new_map.end(), hoặc dùng nó kết thúc trong các bí ẩn lớn?

Lưu ý: Tôi biết điều này là sai lầm và không phải là cách để làm việc. Tôi đang làm việc xung quanh một số mã công ty WTF.

+1

Vì vậy, bạn đã biên soạn nó và kiểm tra xem nó sẽ là new_map.end() ở cuối? Có lẽ cách dễ nhất để trả lời một câu hỏi như thế này nếu bạn không chắc chắn. – Goz

+9

@Goz: Không, điều đó sẽ chỉ trả lời những gì một triển khai đang thực hiện. – sbi

+3

Bản sao có thể có của [Điều gì sẽ xảy ra nếu bạn tăng một trình lặp lại bằng với trình lặp kết thúc của một container STL] (https://stackoverflow.com/questions/1057724/what-happens-if-you-increment-an-iterator -that-is-equal-to-the-end-iterator-of-a) – Raedwald

Trả lời

11

Điều kiện tiên quyết trên operator ++ cho một iterator về phía trước là iterator là dereferenceable. Điều này ngụ ý rằng nó không thể vượt qua cuối bản đồ, vì vậy mã của bạn cho hành vi không xác định. Điều này được mô tả trong phần 24.1.3 của tiêu chuẩn C++.

+0

24.2.3 trên thực tế cho bộ lặp đầu vào, 24.2.4 cho đầu ra. – Ruslan

5

Như những người khác đã chỉ ra, tăng trình lặp kết thúc gây ra hành vi không xác định, tuy nhiên nó đáng chú ý rằng Visual Studio 2008 sẽ ném một xác nhận gỡ lỗi tại thời gian chạy (do checked iterators) của nó nếu bạn làm điều này.

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