如何在删除STL时遍历STL中的所有元素(如unordered_set)

时间:2016-08-26 04:34:54

标签: c++ stl iterator

我写了一个示例代码:

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并且分段错误。 如何擦除元素,同时保持迭代器有效?

我的英语水平提高了。

谢谢大家的帮助!

2 个答案:

答案 0 :(得分:1)

在最后删除的元素后删除returns迭代器,所以只需替换

s.erase(.....);

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

代码中的任何地方。

答案 1 :(得分:1)

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

jQuery(function($) {
  $('.clickable-images').click(function() { 
    $('#imgretprd').attr('src',$(this).attr('src')); 
  });
});