Неожиданное поведение вектора при использовании пересечения множества - PullRequest
0 голосов
/ 01 декабря 2018

Я пытаюсь сравнить 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 нулей.Но как только он начинает второй цикл, как только он попадает в фигурную скобку, он получает 101 миллион вместо 9. Как только он действительно достигает своего объявления, он возвращается к 9, что является правильным.Во время отладки я заметил, что в нем содержатся все 2-мерные векторы, с которыми я проверяю, до того как объявление исправит его до значения только 9 дюймов.

idzireit

APPENDUM:

Как уже было сказано, я забыл задать свой вопрос.Приведенный выше код работает так, как я хочу, чтобы количество совпадений (между 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. Надеюсь, что это поможет уточнить, что я пытаюсь сделать.

ADDENDUM 2:

Теперь, когда у меня запущен и работает мой обмоточный станокпереустановил QT Creator на нем Я запустил приведенный выше код и отлично работает на Windows.Я не получаю 101 миллион элементов, как при работе под Ubuntu.Почему он работает правильно на windoze, а не на Ubuntu?

idzireit

1 Ответ

0 голосов
/ 01 декабря 2018

Во-первых, согласно https://en.cppreference.com/w/cpp/algorithm/set_intersection, оба вектора должны пересекаться должны быть отсортированы .

Во-вторых, вы устанавливаете начальный размер 9 для вектора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));
...