Tôi đang cố gắng tìm ra cách hoạt động của các trình vòng lặp std::multimap
, do đó tôi đã tạo ra một ví dụ đơn giản cho thấy vấn đề của vấn đề của tôi. Nếu trường hợp uncomment 1, tôi mong đợi iterator trỏ đến phần tử đầu tiên với khóa 1, nhưng trên thực tế nó in tất cả các giá trị liên quan đến khóa 0 (như không có gì bị xóa) và đôi khi nó bị treo, có thể do trình vòng lặp không hợp lệ. Tuy nhiên, nếu trường hợp bỏ ghi chú 2, tất cả các giá trị bằng khóa 1 sẽ được xóa đúng cách.C++ multimap iterator invalidation
Có cách nào để biết trình lặp hợp lệ tiếp theo cho số multimap
sau khi xóa không? (ví dụ std::vector.erase(...)
lợi nhuận một)
std::multimap<int, int> m;
for(int j=0; j<3; ++j) {
for(int i=0; i<5; ++i) {
m.insert(std::make_pair(j, i));
}
}
for(std::multimap<int, int>::iterator it=m.begin(); it!=m.end();) {
printf("%d %d\n", (*it).first, (*it).second);
++it;
if((*it).second == 3) {
//m.erase(0); //case 1
m.erase(1); //case 2
}
}
"' (* it) .first' "tại sao không' it-> first'? – curiousguy
Liệu nó thực sự quan trọng? nó hoàn thành điều tương tự và tôi chắc chắn 95% nó sẽ biên dịch thành cùng một mã. –
@curiousguy khiến tôi thích viết (* nó) .first. – givi