2011-04-03 64 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; 
} 
相關問題