【问题标题】:Extracting from set/unordered_set while using iterators使用迭代器时从 set/unordered_set 中提取
【发布时间】:2020-11-05 04:07:51
【问题描述】:

我刚刚了解了在 C++17 中添加到 std::set/std::unordered_setextract 函数。我知道这是有效的:

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 误读了,谢谢。

标签: c++ c++17


【解决方案1】:

但是是否保证 extract 不会使其他迭代器失效?

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

【讨论】:

    猜你喜欢
    • 2014-08-21
    • 1970-01-01
    • 2013-09-13
    • 1970-01-01
    • 2012-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多