2012-10-20 80 views
2

我有向量A包含數字1,7,9,9,3,13,3 我有向量B包含數字9,11,7,7,3,2 ,1兩個向量的聯合

我需要得到向量C,它將包含下面兩個向量中的每個元素,但每個元素只有一次(例如,向量A中的數字9不應該重複) 因此C應該包含1,7,9, 3,13,11,2

此代碼將使這將是兩個矢量的聯合,但還會有一些數字重複矢量C(如果一個向量包括3×1號,則C也包括3×號1)

vector<int>union(vector<int>A,vector<int>B) 
{ 
    sort(A.begin(),A.end()); 
    sort(B.begin(),B.end()); 
    vector<int> C(A.size()*2);   //vector A has same size as vector B 

    vector<int>::iterator it= set_union(A.begin(),A.end(),B.begin(),B.end(),C.begin()); 
    C.resize(it-C.begin()); 
    return C; 
} 

它必須儘可能快地工作。 這樣做的最好方法是什麼?

+5

爲什麼不使用C作爲std :: set和covert設置爲vector。 – MarsRover

+0

@MarsRover你絕對正確,一套是數學和編程方式的正確選擇,對於給定的要求 – Paranaix

+0

與大矢量大小它是相當緩慢:(我需要得到它的工作更快 – Serillan

回答

1

此問題的正確解決方案是先排序每個矢量,然後以類似於sink排序的方式獲取交集/聯合/篩選。

+1

哪個std :: set將做適當的,沒有泡沫或水槽分類 – nurettin