2012-04-05 40 views
9

Có được phép xóa một phần tử được chỉ bởi trình vòng lặp và chuyển tiếp cùng một trình lặp trong một dòng để đi đến phần tử tiếp theo không?C++ đặt phép loại bỏ vòng lặp

set<int>::iterator it = S.begin(); 
while (it != S.end()) { 
    if (shouldBeRemoved(*it)) { 
     S.erase(it++); // is this line valid? 
    } else { 
     ++it; 
    } 
} 

Trả lời

5

là nó cho phép xóa một yếu tố được trỏ bởi iterator, và thúc đẩy các iterator cùng trong một dòng để đi đến phần tử tiếp theo?

Có, nó hợp lệ.


Lý do:

it++ increments it để nó đề cập đến phần tử tiếp theo nhưng mang lại một bản sao của giá trị ban đầu của nó . Do đó, it không đề cập đến phần tử bị xóa khi gọi erase(). Và trong trường hợp std::set chỉ các trình vòng lặp tới phần tử đã xóa bị vô hiệu. # 1

Bạn có thể xem ví dụ mã này làm mã bản mẫu để xóa phần tử mà trình vòng lặp của bạn đang tham chiếu.


Tài liệu tham khảo:

Đối std::set,
# 1C++ 03 Chuẩn 23.1.2/8:

Chỉ lặp và tài liệu tham khảo cho xóa các phần tử không hợp lệ

2

Có, nó hợp lệ. Biểu thức it++ được đánh giá đầy đủ trước khi hàm được gọi, do đó hàm nhận giá trị trước đó là it, nhưng do thời gian bị loại bỏ (và không hợp lệ), trình lặp đã được tăng lên.

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