【发布时间】:2020-11-05 04:07:51
【问题描述】:
我刚刚了解了在 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 不会使其他迭代器失效?
【问题讨论】:
-
@parktomatomi 链接显示“所有关联容器:提取成员仅使已删除元素的迭代器无效;指向已删除元素的指针和引用仍然有效 [26.2.6/10]”
-
这能回答你的问题吗? Iterator invalidation rules
-
@AyxanHaqverdili 误读了,谢谢。