【问题标题】:C++ Recursive Union, Intersection, and DifferenceC++ 递归联合、交集和差异
【发布时间】:2013-03-18 06:08:05
【问题描述】:

这是一个家庭作业,我真的不知道该怎么做。我通常会创建 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;
}

【问题讨论】:

  • 那么,问题是什么?
  • @Jaysen Stoudt 你没有发布你的整个代码。我们只有包装器。请编辑您的问题,以便我们回答。
  • @jrd1 我的问题是如何实现它,因为我无法在方法之外创建 v3 并且我不知道如何在方法内部创建它?
  • 您需要我们为所有功能编写正文???
  • @Zadirion 每对中的第一个是包装器,第二个是方法,我不知道从哪里开始,因为我不知道如何在其中创建 v3。

标签: c++ recursion set-theory


【解决方案1】:

您通过转发T 模板参数并将其传递给vector 来创建v3,就像我在下面所做的那样:

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);

【讨论】:

  • 我首先担心的是这不是递归的。我怎么能把它变成一个递归函数?另外,在这方面,它是否将 v2 到 v3 的每个值都添加了?导致可能的重复?如果是这样,我该如何避免呢?
  • 抱歉,我没有注意到这些要求。让我为您解决它
  • 这样做时,会不会影响原始向量?比如,原来的 v2 会是空的吗?
  • 编辑:只需阅读说明。是的,在测试器类中,他重用向量再次测试,这就是为什么在我最初的计划中,我要创建一个 v3.3 版本。我怎样才能修改它,以免改变原来的 v1 和 v2?
  • 您可以将代码从 vec_union 移动到新的 vec_union_helper 函数,从 vec_union 调用它并将 v1 和 v2 的副本传递给它。原件保持不变,一切正常。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-07-09
  • 1970-01-01
  • 2010-10-28
  • 2012-01-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多