首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >c++ -消失的变量

c++ -消失的变量
EN

Stack Overflow用户
提问于 2018-06-06 07:22:48
回答 1查看 216关注 0票数 1

我正在编写一个函数,以获取两个名为ab的排序vector<size_t>的交集。该函数遍历这两个向量,从a中删除任何不在b中的内容,这样a中剩下的内容就是这两个向量的交集。代码如下:

代码语言:javascript
复制
void intersect(vector<size_t> &a, vector<size_t> &b) {
  vector<size_t>::iterator aItr = a.begin();
  vector<size_t>::iterator bItr = b.begin();
  vector<size_t>::iterator aEnd = a.end();
  vector<size_t>::iterator bEnd = b.end();

  while(aItr != aEnd) {
    while(*bItr < *aItr) {
      bItr++;
      if(bItr == bEnd) {
        a.erase(aItr, aEnd);
        return;
      }
    }
    if (*aItr == *bItr) aItr++;
    else aItr = a.erase(aItr, aItr+1);
  }
}

我得到了一个很大的bug。我正在单步执行调试器,一旦它通过了第8行,"while(*bItr < *aItr)b似乎就消失了。调试器似乎甚至不知道b的存在!当b返回到循环的顶部后重新存在时,它现在已经采用了a的值!

这是我期望在动态内存错误中看到的那种行为,但正如您所看到的,我在这里并没有管理任何动态内存。我非常困惑,真的需要一些帮助。

提前感谢!

EN

回答 1

Stack Overflow用户

发布于 2018-06-06 07:31:46

好吧,也许你应该首先解决代码中的一个主要问题:迭代器失效。

请看: StackOverflow上的Iterator invalidation rules

当您擦除向量中的一个元素时,不能保证在删除点和更远的位置进入该向量的迭代器是有效的。不过,您的代码假定aEnd具有这样的有效性(感谢@SidS)。

我猜这可能是你所看到的原因,或者可能是你的编译器优化标志改变了执行流程,不必要的变量的生命周期,等等。

另外,as @KT。注意,你的擦除可能真的很昂贵,这使得你的算法可能是在a的长度上的二次时间。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50710218

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档