2011-04-03 63 views
2

我有有两个属性的类:为什么编译器在我的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编译,但不知从哪里开始纠正错误

谢谢你知道你的时间

艾蒂安

回答

1

第五个参数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>

+0

非常感谢,这解决了我的问题!感谢大家的建议! – CoachNono 2011-04-03 15:46:50

0

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; 
+0

它为什么需要一个序列?它似乎只需要一个输出迭代器。 – 2011-04-03 03:06:49

+0

@Jerry:对。我会让你介绍insert_iterator替代方案......我个人倾向于使用'vector'和'sort'来处理这种事情...... – Potatoswatter 2011-04-03 03:09:59

+0

使用vector和sort很好(实际上很可能是上级)。您仍然需要使用back_inserter,或者(如上所述)为结果提前分配足够的空间。 – 2011-04-03 03:15:17

1

看起来你需要使用类似的insert_iterator你的结果。

它也不清楚如何ensEntier1_ensEntier2_你传递给set_intersection对应和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; 
} 
相关问题