рекурсия — C ++ Рекурсивный Союз, Пересечение и Разница

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

Вот код, который у меня есть для них и их функций-оболочек (это всего лишь скелет):

// 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;
}

0

Решение

Вы создаете v3 отодвигая 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);
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]