Nếu tôi đang sử dụng iterator
trong vòng lặp for
và tôi sử dụng erase
trên lặp lại hiện tại của trình lặp, vòng lặp for sẽ tiếp tục tốt và truy cập phần còn lại của các yếu tố list
?Xóa khi đang lặp một tiêu chuẩn: danh sách
Từ nội dung tôi đã đọc, trường hợp này phải là trường hợp và là đặc điểm phân biệt chính của list
so với deque
hoặc vector
. Vì mục đích của tôi, một queue
có thể hoạt động nhưng tôi cần hành vi này.
Đây là vòng lặp Tôi đang xem xét:
std::list<Sequence>::iterator iterator;
iterator=m_concurrents.begin();
for (;iterator!=m_concurrents.end();++iterator){
if (iterator->passes()){
m_concurrents.erase(iterator);
}
}
trong ví dụ này, bạn đang dừng lặp lại khi nó đã bị xóa, do đó không lặp qua danh sách để xem xét các yếu tố khác. Tôi rất thú vị khi lặp lại toàn bộ danh sách và xóa các mục nhập như mong muốn. Từ những gì tôi hiểu, điều này là an toàn với một 'danh sách' nhưng không an toàn với các thùng chứa khác. Đó là trái tim của câu hỏi của tôi, xin lỗi nếu điều đó không rõ ràng. – johnbakers
Điều này sẽ không hoạt động đối với các trình biên dịch không phải C++ 11. Các phương thức thành viên xóa chỉ trả về 'void' trong C++ 03. Thay đổi 'i = list.erase (i)' thành 'list.erase (i ++)' sẽ sửa nó. – Casey
@Casey [bạn sai] (http://en.cppreference.com/w/cpp/container/list/erase) – David