2009-02-02 98 views
0

我有與一種具有VEC1 {E1,E2,E3,E4},而另一個與VEC2 {E2,E4,E5,E7}從2個向量中提取元素?

2矢量如何有效地獲得從上述載體使得三個矢量1.has元素,只有在VEC 1可用類似的2只VEC 2單元和3,具有共同的元素

+0

什麼是元素的類型?他們有可比性嗎?只有4個元素? – 2009-02-02 17:02:43

+0

是的,他們是可比較的,而不僅僅是4元素 – yesraaj 2009-02-02 17:04:58

回答

6

std::set_intersection應該做的伎倆,如果兩個向量進行排序: http://msdn.microsoft.com/en-us/library/zfd331yx.aspx

std::set_intersection(vec1.begin(), vec1.end(), vec2.begin(), vec2.end(), std::back_inserter(vec3)); 

自定義謂詞也可用於比較:

std::set_intersection(vec1.begin(), vec1.end(), vec2.begin(), vec2.end(), std::back_inserter(vec3), my_equal_functor()); 

如果它們沒有排序,你當然可以先對它們進行排序,或者您可以通過迭代VEC 1,對於每個元素,使用std ::發現,看它是否在VEC 2存在。

1

如果元素數量很少,則可以使用易於實現且具有O(n )運行時間的樸素方法。

如果您有大量元素,您可以從其中一個構建哈希表並查找其中的其他向量元素。或者,您可以對其中的一個進行排序並通過二進制搜索。

0

您描述的問題是矢量交集。這取決於輸入向量的大小。

如果兩個向量的大小彼此接近,則合併(如合併排序)是最好的。如果一個矢量比另一個小得多,則執行以下操作:對於較小矢量的每個元素,使用二分搜索在較大矢量中搜索該元素。

這是信息檢索中的一個常見問題,您必須與倒排索引相交。有一些關於此的研究論文。

3

你要求的是vec3十字路口其他兩個。 Jalf演示瞭如何使用the <algorithm> headerstd::set_intersection函數填充vec3。但請記住,要使所設置的功能正常工作,必須對向量進行排序

那麼你一定要vec1vec2是自己和vec3之間的差異。在一套符號:

您可以使用該功能std::set_difference,但你不能用它來修改向量的地方。你必須計算另一個向量以保持差異:

std::vector<foo> temp; 
std::set_difference(vec1.begin(), vec1.end(), 
        vec3.begin(), vec3.end(), 
        std::back_inserter(temp)); 
vec1 = temp; 
temp.clear(); 
std::set_difference(vec2.begin(), vec2.end(), 
        vec3.begin(), vec3.end(), 
        std::back_inserter(temp)); 
vec2 = temp;