使用迭代器从set / unordered_set中提取

问题描述

我刚刚了解了在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不会使其他迭代器无效?

解决方法

但是可以保证提取不会使其他迭代器无效吗?

是的。提取保证不会使其他迭代器无效。这两个循环都是安全的。