我正在尝试将2维矢量与另一个2维矢量进行比较。
vector<vector<int> >::iterator rowit1;
for(rowit1 = aboveaveperms.begin(); rowit1 != aboveaveperms.end();rowit1++)
{
vector<vector<int> >::iterator row2it;
int s = 0;
for(row2it = afterave.begin(); row2it != afterave.end();row2it++)
{
vector<int> matches (9);
vector<int>::iterator itset;
itset = set_intersection(rowit1->begin(),rowit1->end(),row2it->begin() + 1,row2it->end(),matches.begin());
matches.resize(itset-matches.begin());
s = matches.size();
matches.erase(matches.begin(),matches.end()); // my attempt at trying to correct it
}
}
在第一次通过的第二个循环中,将正确地创建包含9个零的匹配项。但是一旦它开始第二个循环,一旦它到达了花括号,它就会以1.01亿而不是9出来。一旦实际到达它的声明,它就会回到9,这是正确的。我在调试时注意到,它在声明将其校正为仅包含9个整数之前,正保存着我要检查的所有二维向量。
idzireit
附录:
正如已经指出的,我忘了问我的问题了。上面的代码确实可以按我想要的匹配数工作(在5到9之间),但是由于向量的不稳定行为,如果其他向量太大,会导致内存泄漏或sigseg吗? 另外,正如whozcraig所问的那样,我有row2it-> begin()+ 1,因为第一个元素是游戏编号,比其他数字大得多。其余的数字虽然排序。 我尝试做的例子如下:
烫发矢量1
1 3 5 6 7
与4个向量进行比较,并计算每个向量中的匹配数
5 8 9 10 11
3 7 11 14 18
1 5 6 7 8
因此在运行循环时,第一场比赛应该是1秒,第二场比赛应该是2,第三场比赛应该是4。希望这有助于阐明我要做什么。
附录2:
现在,我已经启动并运行了windoze机器,并在其上重新安装了qt creator,我已经运行了上面的代码,并且在Windows上可以正常工作。我没有像在ubuntu下运行时那样获得1.01亿个元素。为什么它可以在windoze上正常工作而不在ubuntu上正常工作?
idzireit
答案 0 :(得分:1)
首先,根据https://en.cppreference.com/w/cpp/algorithm/set_intersection,两个向量相交 必须排序 。
第二,您将向量matches
的初始大小设置为9,但是如果相交元素的数量大于9,则std :: set_intersection正在写入matches
的边界之外,可能会导致不确定的行为。
您可以使用内存分析仪Valgrind来执行代码,以检测可能的内存泄漏。您可以使用std::back_inserter
来避免此问题:
#include <iterator> // std::back_inserter
vector<int> matches;
std::back_insert_iterator<std::vector<int> > itset(matches);
itset = set_intersection(rowit1->begin(),rowit1->end(),row2it->begin() + 1,row2it->end(), std::back_inserter(matches));