【问题标题】:unordered_set erase not working in C++unordered_set 擦除在 C++ 中不起作用
【发布时间】:2014-08-22 15:26:17
【问题描述】:

考虑以下情况

void first(){

  unordered_set<int> validPorts;
  int roundNum=0, preFunctionSize, postFunctionSize,j=0 ;

  while(j <100){
    if(some_condition_A){
      validPorts.insert(some_int_value);
    }
    j++;
  }

  do{
     preFunctionSize = validPorts.size();
     second( validPorts, some_int_value );
     postFunctionSize = validPorts.size();
  }while(roundNum<12);

}

void second( unordered_set<int> & validPorts, int some_int_value ){

  for (auto it = validPorts.begin(); it != validPorts.end();) {
    if (it == validPorts.find(some_int_value)) {
      validPorts.erase(it++); // <== CODE enters here, I checked
    } else {
      ++it;
    }
  }
}

所以我希望 postFunctionSize 应该小于 preFunctionSize 因为我知道它一直到擦除功能。但看起来擦除功能不起作用,因为我为它们两个获得了相同的值。我不太确定这里发生了什么以及是什么原因造成的。各位大神能帮我看看这有什么问题吗?

【问题讨论】:

  • validPorts 是如何传递给second() 的?按价值?通过参考?
  • 你的代码很好,你用的是什么编译器?
  • 您实际上是否将some_int_value 插入到集合中?换句话说,对于某些jsome_condition_A 的计算结果是否为真?
  • @PiotrS。嘿,我认为 CashCow 已经添加了缺失的信息 :-) 对不起,我错过了。我实际上是在使用带有 gcc 3.4 的 systemC 编译器 2.3
  • @AntonSavin 是的,我已经检查过了。插入部分工作正常,它的擦除部分给我带来了问题

标签: c++ erase unordered-set


【解决方案1】:

您的代码在某些地方当然是伪代码,但您需要这样做:

it = validPorts.erase( it );

在一个循环中,您正在遍历一个删除其中一些的集合。

但是,这也不是您真正想要做的。您正试图从您的 unordered_set 中删除一个值,所以就这样做

validPorts.erase( some_int_value );

而且没有循环。

【讨论】:

  • 相当于validPorts.erase(it++);!根据规范:只有迭代器和对 删除的元素的引用是无效的。
  • @Jarod42: it++ 增加隐藏在it 变量后面的迭代器,但返回指向前一个值的迭代器副本。iterator operator++(int) { iterator copy(*this); ++(*this); return copy; }
猜你喜欢
  • 1970-01-01
  • 2020-05-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-03
相关资源
最近更新 更多