c ++ set_intersection, имеющий разные результаты с одинаковым вводом - PullRequest
1 голос
/ 27 мая 2019

Я пытался получить пересечение двух множеств, но по какой-то причине он продолжает иметь разные результаты с одними и теми же входами.Std :: set_intersect получает итераторы для двух наборов (connBuilds, connectedSection): первый имеет 5 значений, а второй - 4. Вот значения наборов (содержащие указатели на класс):

Set1:

Set 1

Набор 2:

Set 2

Ожидаемый результатбудет набором, содержащим 4 общих значения между наборами, но результат меняется с каждым выполнением.Иногда результат верный, иногда нет.

Вот сегмент кода, где выполняется пересечение:

std::vector<Building *> v;
bool hasHC = false;
bool hasH = false;

ConnectedBuildings connBuilds = invertedBuildingsItr->second;
std::set_intersection(connectedSection.begin(), connectedSection.end(), connBuilds.begin(),
                              connBuilds.end(), std::back_inserter(v));
size_t currentSize = v.size();

Вот структура, используемая для сравнения указателей:

struct buildingPTRComp
{
    bool operator()(Building *b1, Building *b2) const
    {
        return b1->getIdentifier() < b2->getIdentifier();
    }

};

typedef std::set<Building *, buildingPTRComp> ConnectedBuildings;

1 Ответ

0 голосов
/ 27 мая 2019

std::set_intersection не знает о вашей функции сравнения, вы указываете свой компаратор для набора, но большинство функций <algorithm> просто работают на итераторах, как и предполагалось.

Вы должны передать свой компаратор в функциюсам по себе, используя правильную перегрузку:

template< class InputIt1, class InputIt2,
          class OutputIt, class Compare >
OutputIt set_intersection( InputIt1 first1, InputIt1 last1,
                           InputIt2 first2, InputIt2 last2,
                           OutputIt d_first, Compare comp );
...