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

伊兹雷特

我正在尝试将 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 个整数。

伊兹雷特

附录:

正如有人指出的那样,我忘了问我的问题。上面的代码确实有效,因为我想要匹配的数量(在 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 上正常工作?

伊兹雷特

航空游艇

首先,根据https://en.cppreference.com/w/cpp/algorithm/set_intersection,两个相交的向量必须排序

其次,您将 9 的初始大小设置为 vector matches,但如果相交元素的数量大于 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));

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

使用集合的2个数组的交集

来自分类Dev

使用向量化分配时发生意外的Matlab行为

来自分类Dev

SimpleInjector显式注册的单例集合的意外行为

来自分类Dev

当找到几个集合的交集时,这是使用retainAll()最快的顺序

来自分类Dev

当找到几个集合的交集时,这是使用retainAll()最快的顺序

来自分类Dev

如何找到列表的交集和并集(不使用集合)

来自分类Dev

C ++中的向量交集

来自分类Dev

排序向量的交集

来自分类Dev

n个向量的交集

来自分类Dev

集合和字典的交集

来自分类Dev

使用异常选择的意外行为

来自分类Dev

关于使用数组和位向量的集合

来自分类Dev

F#中的集合交集

来自分类Dev

根据集合交集筛选结果?

来自分类Dev

根据集合交集筛选结果?

来自分类Dev

地图值和集合的交集

来自分类Dev

意外的行为:从数据框中删除行将转换为向量R

来自分类Dev

实体框架向集合添加对象会导致意外行为

来自分类Dev

在R中使用负前瞻的意外行为

来自分类Dev

使用空数组意外行为初始化哈希

来自分类常见问题

使用bcrypt的长密钥出现意外行为

来自分类Dev

Python-使用元组比较字典列表-意外行为?

来自分类Dev

使用OpenMP难以理解代码中的某些意外行为

来自分类Dev

使用OnPush策略进行变更检测的意外行为

来自分类Dev

使用ostringstream时发生意外行为

来自分类Dev

使用bcrypt的长密钥出现意外行为

来自分类Dev

PG使用CTE和DML语句的意外行为

来自分类Dev

使用BSON的意外行为:Julia中的@load

来自分类Dev

在成对的std :: vector上使用std :: count的意外行为