2012-10-12 3 views
3

이 코드에 문제가 있습니다. 코드가 컴파일되고 있지만 벡터의 내용을 테스트하려고하면 테스트가 실패합니다. 여기C++ set_union iterator

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 : 출력 크기의 상한 및 하한은 각각 '최대 (v1.size(), v2.size())'및 'v1.size() + v2.size()'입니다. –

답변

6

std::set_union은 입력 데이터를 정렬해야하는데, 이는 v1이 아닙니다.

편집 : 주석에 명시된 바와 같이, 합쳐진 결과에 정확히 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 '(출력 크기의 상한) 벡터. –