2012-05-21 42 views
9

tôi sử dụng một cái gì đó như thế này:Giá trị trả về của bản đồ :: begin() cho một bản đồ trống là gì?

map<string, Data>::iterator it = mymap->begin(); 
map<string, Data>::iterator end = mymap->end(); 

while (it != end) { 
    // do stuff 
    ++it; 
} 

Tôi chỉ tự hỏi nếu điều này sẽ làm việc ngay cả khi bản đồ trống. Tôi không thể tìm thấy bất kỳ thông tin nào về việc trả lại bản đồ :: bắt đầu() nếu bản đồ trống.

+0

Tôi có thể đề xuất chỉ tạo một chương trình nhỏ để thử nghiệm không? –

+1

'std :: khoảng cách (bắt đầu, kết thúc)' sẽ bằng không. –

+0

Đẹp! Tôi đã không nhận thức được chức năng này. – HWende

Trả lời

15

Nếu bản đồ trống, các trình biến đổi beginend là bằng nhau, tức là trả về mymap->end().

+0

Điều này đúng, và bạn nên luôn so sánh trình lặp được trả về bởi 'begin()' thành 'end()' trước khi sử dụng nó nếu bản đồ có thể trống (lưu ý cách vòng lặp của bạn sử dụng 'while() ...' không 'do ... while()', do đó, nó kiểm tra chính xác trước khi thực thi câu lệnh được kiểm soát). Bạn hỏi giá trị là gì - nó có thể là bất kỳ thứ gì cung cấp nó so sánh với 'end()', và kết hợp sự cần thiết cho các trình vòng lặp đến các phần tử thực tế khác nhau ... tiêu chuẩn rời khỏi trình biên dịch/thực hiện để chọn một giá trị phù hợp. –

+0

Tôi đoán nó là tốt hơn để kiểm tra 'map :: empty()' phải không? –

-1

Bạn không được cố gắng tăng thêm một trình lặp trước, HOẶC CHẤP NHẬN một trình lặp tới bản đồ trống, đó là lý do tại sao bạn phải có câu lệnh trong mã để kiểm tra bản đồ và/hoặc trình lặp trước khi bạn sử dụng nó.

+0

Câu lệnh 'if' không phải là loại duy nhất có điều kiện,' while' được sử dụng trong câu hỏi cũng sẽ hoạt động tốt. –

+0

Đối với bản đồ trống sẽ 'it == end'. Vì vậy, mã sẽ không nhập trong khi vòng lặp. Nó có nghĩa là bạn sẽ không có vấn đề với lặp đi lặp lại dereferencing. –

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