使用集合交集的意外矢量行为

时间:2018-12-01 14:50:09

标签: c++ vector set-intersection

我正在尝试将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

1 个答案:

答案 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));