Tôi có hai std::map<>
đối tượng a
và b
muốn di chuyển ( extract
+ insert
) một số phần tử (nút) từ bản đồ này sang bản đồ khác dựa trên một số vị ngữp
.
for (auto i = a.begin(); i != a.end(); ++i)
if (p(*i))
b.insert(a.extract(i))
Mã này segfaults trong tiếng kêu. Tôi giả sử vấn đề là sự gia tăng củai
sau khi nút của nó được trích xuất từ a.
Là cách đúng / duy nhất để khắc phục điều này bằng cách sử dụng tăng sau?, Ví dụ:
for (auto i = a.begin(); i != a.end();)
if (p(*i))
b.insert(a.extract(i++))
else
++i;
EDIT : Tôi đã xóa phần về "tại sao điều này hoạt động trong gcc?", Vì tôi không thể sao chép phần này trên thiết lập hiện tại của mình. Tôi tin rằng nó đã từng xảy ra tại một số thời điểm nhưng với gcc 9.2.1, tôi gặp bế tắc (thay vì segfault). Dù bằng cách nào, tăng sau khi extract()
không hoạt động.
std::set
và std::map
rất giống nhau, và theo như tôi có thể nói extract
có cùng hàm ý vô hiệu như erase
.