C ++ 11
Điều này đã được sửa trong C ++ 11 (hoặc xóa đã được cải thiện / thực hiện nhất quán trên tất cả các loại container).
Phương thức xóa bây giờ trả về iterator tiếp theo.
auto pm_it = port_map.begin();
while(pm_it != port_map.end())
{
if (pm_it->second == delete_this_id)
{
pm_it = port_map.erase(pm_it);
}
else
{
++pm_it;
}
}
C ++ 03
Xóa các phần tử trong bản đồ không làm mất hiệu lực bất kỳ trình lặp nào.
(ngoài các trình lặp trên phần tử đã bị xóa)
Trên thực tế, việc chèn hoặc xóa không làm mất hiệu lực của bất kỳ trình lặp nào:
Cũng xem câu trả lời này:
Kỹ thuật Mark Ransom
Nhưng bạn cần phải cập nhật mã của mình:
Trong mã của bạn, bạn tăng pm_it sau khi gọi xóa. Tại thời điểm này, nó đã quá muộn và đã bị vô hiệu.
map<string, SerialdMsg::SerialFunction_t>::iterator pm_it = port_map.begin();
while(pm_it != port_map.end())
{
if (pm_it->second == delete_this_id)
{
port_map.erase(pm_it++); // Use iterator.
// Note the post increment.
// Increments the iterator but returns the
// original value for use by erase
}
else
{
++pm_it; // Can use pre-increment in this case
// To make sure you have the efficient version
}
}
std::remove_if
không hoạt động vớistd:map