【问题标题】:How to traverse all the elements in a STL (like unordered_set) while deleting them如何在删除它们的同时遍历 STL 中的所有元素(如 unordered_set)
【发布时间】:2016-08-26 04:34:54
【问题描述】:

我已经写了一个示例代码:

void eg(){
  unordered_set<int> s;
  s.insert(1);
  s.insert(4);
  s.insert(3);
  s.insert(6);
  auto ite = s.begin();
  while(ite != s.end()){
    int num = *ite;
    cout << num << endl;
    while(s.find(num+1) != s.end()){
      s.erase(s.find(num));
      num++;
    }
    while(s.find(num-1) != s.end()){
      s.erase(s.find(num));
      num--;
    }
    auto tmp = ite;
    ite ++;
    s.erase(tmp);
  }
}

所以基本上它会创建一个集合并在其中添加 {1,3,4,6}。它遍历集合并打印元素,打印后删除集合中的所有连续元素。

所以代码应该打印类似 1,x(3 和 4 之一,因为另一个将被删除),6。

但是在我运行它之后,它打印出 3 和分段错误。 我怎样才能擦除元素并同时保持迭代器有效?

我的英语正在提高。

谢谢大家的帮助!

【问题讨论】:

  • num 为3 时,当你到达auto tmp = ite;ite 已经失效,因为你删除了它指向的元素...

标签: c++ stl iterator


【解决方案1】:

擦除returns最后一个被移除元素之后的迭代器,所以只需替换

s.erase(.....);

ite = s.erase(.....);

代码中的任何地方。

【讨论】:

    【解决方案2】:

    使用std::set::erase返回的迭代器。

    ite = s.erase(...);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-10-20
      • 1970-01-01
      • 1970-01-01
      • 2013-08-05
      • 1970-01-01
      • 1970-01-01
      • 2017-11-18
      • 2013-06-23
      相关资源
      最近更新 更多