问题描述
我刚刚了解了在C ++ 17中添加到std::set
/ std::unordered_set
中的extract
函数。我知道这是有效的:
while (!my_set.empty()) {
auto node_handle = my_set.extract(my_set.begin());
auto elem = std::move(node_handle.value());
}
但是以下安全吗? (摘自https://stackoverflow.com/a/42519996/3234803)
for (auto it = my_set.begin(); it != my_set.end(); ) {
auto node_handle = my_set.extract(it++);
auto elem = std::move(node_handle.value());
}
我知道extract
使传递给它的迭代器无效,因此extract(it++)
在it
无效之前将下一个迭代器保存到it
中。但是是否可以保证extract
不会使其他迭代器无效?
解决方法
但是可以保证提取不会使其他迭代器无效吗?
是的。提取保证不会使其他迭代器无效。这两个循环都是安全的。