我正在编写一个函数,以获取两个名为a
和b
的排序vector<size_t>
的交集。该函数遍历这两个向量,从a
中删除任何不在b
中的内容,这样a
中剩下的内容就是这两个向量的交集。代码如下:
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
的值!
这是我期望在动态内存错误中看到的那种行为,但正如您所看到的,我在这里并没有管理任何动态内存。我非常困惑,真的需要一些帮助。
提前感谢!
发布于 2018-06-06 07:31:46
好吧,也许你应该首先解决代码中的一个主要问题:迭代器失效。
请看: StackOverflow上的Iterator invalidation rules。
当您擦除向量中的一个元素时,不能保证在删除点和更远的位置进入该向量的迭代器是有效的。不过,您的代码假定aEnd具有这样的有效性(感谢@SidS)。
我猜这可能是你所看到的原因,或者可能是你的编译器优化标志改变了执行流程,不必要的变量的生命周期,等等。
另外,as @KT。注意,你的擦除可能真的很昂贵,这使得你的算法可能是在a的长度上的二次时间。
https://stackoverflow.com/questions/50710218
复制相似问题