2012-10-12 73 views
3

我有這個代碼的一些問題,代碼編譯,但是當我嘗試測試向量的內容時,測試失敗。下面是代碼:C++ set_union迭代

using std::vector; 

// returns a different vector, containing all elements in v1 and all elements in v2       (elements who are either in v1 or v2) but no duplicates. 

template <typename T> vector<T> set_union(const vector<T>& v1, const vector<T>&v2) 
{ 
    vector<T> v(20); 
    typename vector<T>::iterator it; 

    it = set_union (v1.begin(), v1.end(), v2.begin(), v2.end(), v.begin()); 
    return v; 
} 

,這裏是我運行測試:

TEST_F(MyTest,set_union) { 
     vector<int> v1{1,3,2}; 
     vector<int> v2{1,4}; 
     vector<int> v=set_union(v1,v2); 
     ASSERT_EQ(0,count(v,9)); 
     ASSERT_EQ(1,count(v,1)); 
     ASSERT_EQ(1,count(v,2)); 
     ASSERT_EQ(1,count(v,3)); 
     ASSERT_EQ(1,count(v,4)); 

}

當我運行這些測試,第一次測試通過,但第二個測試返回0向量中數字1的實例,其中答案應該是1個實例。

+0

你不應該使用矢量與結果的預定義的大小:使用'的std :: back_inserter(V)'代替。如果你對結果的大小有一個很好的估計,你可能想'v.reserve()'。 –

+0

@DietmarKühl:在輸出尺寸的下限和上限是已知的('MAX(v1.size(),v2.size())'和'v1.size()+ v2.size()',分別地)。 –

回答

6

的問題是,std::set_union需要進行排序輸入數據,你的v1不是。

編輯:正如評論指出的,你不應該預先大小的載體,因爲它會風與一堆0的,除非你有在被聯合的結果正好20個項目。相反,那這樣的事情(我改變了名稱,使其更具描述性的,並在呼叫忍者編輯保留基於評論約束最小尺寸):

template <typename T> 
std::vector<T> vector_union(const std::vector<T>& v1, const std::vector<T>& v2) 
{ 
    vector<T> v; 
    v.reserve(std::max(v1.size(), v2.size()); 

    set_union (v1.begin(), v1.end(), v2.begin(), v2.end(), std::back_inserter(v)); 

    return v; 
} 

如果需要的話,你甚至可以有在調用set_union之前對矢量進行排序,但會導致預先排序的輸入不需要的工作。

+0

請注意,你可能想'.reserve(MAX(v1.size(),v2.size())'(低輸出尺寸約束)或'.reserve(v1.size()+ v2.size()) '(輸出大小的上限)你的向量。 –