2013-03-18 2 views
0

Это домашнее задание, и я действительно не знаю, как это сделать. Обычно я создавал v3 = v1, затем увеличивал бы через v2 через i и проверял, находятся ли элементы v2 в v3. Если нет, я бы добавил их в v3. Но я не могу создать v3 вне метода, и если я попытаюсь создать его внутри метода, он просто перезапустится. Кто-нибудь может мне помочь?Рекурсивный союз C++, пересечение и различие

Вот код, у меня есть для них и их функции обертки до сих пор (это просто скелет):

// returns a new vector; every element in v1 and every element in v2 are also in this new vector 
// if an element appears in both v1 and v2, it is only added once to the new vector 
template <typename T> vector<T> vec_union(vector<T> &v1, vector<T> &v2) 
{ 
    return v1; 
} 

template <typename T> vector<T> vec_union(vector<T> &v1, vector<T> &v2, unsigned i) 
{ 
    return v1; 
} 

// returns a new vector; every element that is in both v1 and v2 are also in this new vector 
// there are no duplicates in v1 and v2 
template <typename T> vector<T> intersection(vector<T> v1, vector<T> v2) 
{ 
    return v1; 
} 

template <typename T> vector<T> intersection(vector<T> v1, vector<T> v2, unsigned i) 
{ 
    return v1; 
} 

// returns a new vector; every element that is in v1 but not v2 are also in this new vector 
// there are no duplicates in v1 and v2 
template <typename T> vector<T> difference(vector<T> v1, vector<T> v2) 
{ 
    return v1; 
} 


template <typename T> vector<T> difference(vector<T> v1, vector<T> v2, unsigned i) 
{ 
    return v1; 
} 
+1

Итак, что вопрос? – jrd1

+0

@Jaysen Stoudt, вы не разместили свой код целиком. Все, что у нас есть, это обертки. Пожалуйста, отредактируйте свой вопрос, чтобы мы могли ответить. –

+0

@ jrd1 Мой вопрос в том, как я могу реализовать его, так как я не могу создать v3 вне метода, и я не знаю, как его создать внутри метода? –

ответ

1

Вы создаете v3 по fowarding параметр T шаблона и передавая его vector как я сделал ниже:

vector<T> v3; 

Я выполнил вашу vec_union функцию для вас. Обратите внимание на следующее: Я создал v3 внутри функции. Я вернул v3, что приводит к копиям v3, которые будут получать внешние коды, когда звонящий звонит vec_union.

template <typename T> vector<T> 
vec_union(vector<T> &v1, vector<T> &v2) 
{ 
    if (v2.empty()) 
    return v1; 

    vector<T>::iterator found = std::find(v1.begin(), v1.end(), v2.back()); 
    if (found == v1.end()) 
    { 
    // all good, element not already in v1, so insert it. 
    T value = v2.back(); 
    v1.push_back(value); 
    v2.pop_back(); // remove back element 
    return vec_union(v1, v2); 
    } 
    else 
    { 
    // element was already in v1, skip it and call vec_union again 
    v2.pop_back(); // remove back element 
    return vec_union(v1, v2); 
    } 
} 

Обратите внимание, что мой ответ изменяет v1 и v2. Я предположил, что это то, чего ожидал ваш учитель, чтобы добиться рекурсивной реализации, которая не является смехотворно неэффективной, многократно копируя v1 и v2 вокруг.

Вы называете vec_union так:

vector<int> firstVector; 
vector<int> secondVector; 
vector<int> unionVector = vec_union(firstVector, secondVector); 
+0

Моя первая проблема заключается в том, что это не рекурсивно. Как я могу превратить это в рекурсивную функцию? Кроме того, добавляется ли это значение от v2 до v3? Вывод возможных дубликатов? И если да, то как я могу избежать этого? –

+0

Извините, я не заметил этих требований. Позвольте мне исправить это для вас. –

+0

При этом это влияет на исходные векторы? Например, будет ли исходный v2 пустым? –