我有與一種具有VEC1 {E1,E2,E3,E4},而另一個與VEC2 {E2,E4,E5,E7}從2個向量中提取元素?
2矢量如何有效地獲得從上述載體使得三個矢量1.has元素,只有在VEC 1可用類似的2只VEC 2單元和3,具有共同的元素
我有與一種具有VEC1 {E1,E2,E3,E4},而另一個與VEC2 {E2,E4,E5,E7}從2個向量中提取元素?
2矢量如何有效地獲得從上述載體使得三個矢量1.has元素,只有在VEC 1可用類似的2只VEC 2單元和3,具有共同的元素
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存在。
如果元素數量很少,則可以使用易於實現且具有O(n )運行時間的樸素方法。
如果您有大量元素,您可以從其中一個構建哈希表並查找其中的其他向量元素。或者,您可以對其中的一個進行排序並通過二進制搜索。
您描述的問題是矢量交集。這取決於輸入向量的大小。
如果兩個向量的大小彼此接近,則合併(如合併排序)是最好的。如果一個矢量比另一個小得多,則執行以下操作:對於較小矢量的每個元素,使用二分搜索在較大矢量中搜索該元素。
這是信息檢索中的一個常見問題,您必須與倒排索引相交。有一些關於此的研究論文。
你要求的是vec3
是十字路口其他兩個。 Jalf演示瞭如何使用the <algorithm>
header的std::set_intersection
函數填充vec3
。但請記住,要使所設置的功能正常工作,必須對向量進行排序。
那麼你一定要vec1
和vec2
是自己和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;
什麼是元素的類型?他們有可比性嗎?只有4個元素? – 2009-02-02 17:02:43
是的,他們是可比較的,而不僅僅是4元素 – yesraaj 2009-02-02 17:04:58