Почему компилятор выдает ошибку в моем set_intersection?

У меня есть класс, который имеет два атрибута:

 set< int > ens1_;
 set< int > ens2_;

Теперь у меня есть метод, который находит пересечение между этими двумя множествами. Вот что я написал в своем методе:

set< int > ens;
set< int >::iterator it;

it = set_intersection(ensEntier1_.begin(), ensEntier1_.end(), ensEntier2_.begin(), ensEntier2_.end(), ens.begin());
return ens;

Это дает мне ошибку при компиляции внутри stl_algo.h, но я не знаю, с чего начать, чтобы исправить ошибку

Спасибо за ваше время

Этьен


person Etienne Noël    schedule 03.04.2011    source источник


Ответы (3)


5-й аргумент перегрузки set_intersection, которую вы вызываете, ожидает выходной итератор; ens.begin() не возвращает итератор вывода. Попробуйте это вместо этого:

set<int> ens;
set_intersection(
    ens1_.begin(),
    ens1_.end(),
    ens2_.begin(),
    ens2_.end(),
    inserter(ens, ens.end())
);
return ens;

Примечание: убедитесь, что вы #include <iterator>.

person ildjarn    schedule 03.04.2011
comment
Большое спасибо, это решило мою проблему! Спасибо всем также за ваши предложения! - person Etienne Noël; 03.04.2011

Похоже, вам нужно использовать что-то вроде insert_iterator для вашего результата.

Также неясно, как ensEntier1_ и ensEntier2_, которые вы передаете set_intersection, соответствуют ens1_ и ens2_, но на данный момент я предполагаю, что они соответствуют.

Изменить: вот рабочий пример:

#include <algorithm>
#include <set>
#include <iterator>
#include <iostream>

int main(){ 

    std::set<int> set1;
    std::set<int> set2;

    set1.insert(1);
    set1.insert(2);
    set1.insert(5);

    set2.insert(2);
    set2.insert(3);
    set2.insert(5);

    std::set<int> result;

    std::set_intersection(set1.begin(), set1.end(), 
                          set2.begin(), set2.end(), 
                          std::inserter(result, result.end()));
    std::copy(result.begin(), result.end(), 
              std::ostream_iterator<int>(std::cout, "\n"));
    return 0;
}
person Jerry Coffin    schedule 03.04.2011

set_intersection должен записывать в контейнер последовательности, такой как vector, а не в ассоциативный контейнер, такой как set, если используются собственные итераторы контейнера.

Попробуй это:

vector< int > ens( min( ensEntier1_.size(), ensEntier2_.size() );
vector< int >::iterator it;

it = set_intersection(ensEntier1_.begin(), ensEntier1_.end(), ensEntier2_.begin(), ensEntier2_.end(), ens.begin());
ens.erase( it, ens.end() );
return ens;
person Potatoswatter    schedule 03.04.2011
comment
Зачем ему последовательность? Кажется, требуется только итератор вывода. - person Jerry Coffin; 03.04.2011
comment
@ Джерри: Верно. Я позволю вам рассказать об альтернативе insert_iterator… лично я предпочитаю использовать vector и sort для такого рода вещей… - person Potatoswatter; 03.04.2011
comment
Использование вектора и сортировки прекрасно (на самом деле, вполне возможно, лучше). Вам все еще нужно либо использовать back_inserter, либо (как вы сделали выше) заранее выделить достаточно места для результата. - person Jerry Coffin; 03.04.2011