Tôi đã lên và xuống stackoverflow và thậm chí rất, rất đẹp Dr. Dobbs article nhưng tôi không thể tìm thấy một câu trả lời dứt khoát cho câu hỏi.Làm cách nào để xóa * VÀ TIẾP TỤC * bằng cách sử dụng std :: reverse_iterator?
Một phần câu trả lời cho câu hỏi What are the shortcomings of std::reverse_iterator? nói rằng hoàn toàn không thể.
std::list::reverse_iterator it = list.rbegin();
while( it != list.rend())
{
int value=*it;
if(some_cond_met_on(value))
{
++it;
list.erase(it.base());
}
else
{
++it;
}
}
PS: Tôi biết có các lựa chọn thay thế khác, chẳng hạn như erase_if(), nhưng tôi đang tìm câu trả lời cho câu hỏi cụ thể này.
tôi sẽ cung cấp cho nó một thử . Làm thế nào bạn tìm ra cái này? (Chỉ cần hỏi để tìm hiểu cách học) – Migs
@Migs, bất biến của trình lặp ngược là: '& * (reverse_iterator (i)) == & * (i - 1)'. Bản đồ ngược từ đó (hoặc chỉ nghĩ về việc xóa 'rbegin()') và bạn nhận được mã trong câu trả lời. – MSN
Cảm ơn @MSN. Nó hoạt động hoàn hảo. Tôi đọc điều bất biến đó trong bài viết của Dobbs, nhưng tôi đoán tôi không thể hiểu được những tác động của nó. Tôi sẽ tiếp tục nhìn chằm chằm cho đến khi có điều gì đó (hy vọng) xảy ra. – Migs