【问题标题】:Intersection and Union of two sorted lists (return type)两个排序列表的交集和并集(返回类型)
【发布时间】:2019-07-26 06:31:50
【问题描述】:

此代码用于查找两个排序列表的交集和并集。排序后的列表继承自具有所有基本功能的列表类。主要问题是函数的返回类型是什么。 它是指向列表的指针还是列表本身?我将如何显示该“指针”的内容。

template <typename Object>
class sorted_list : public List<Object>{
    friend sorted_list<Object>*& slUnion( const sorted_list<Object>& list1, const sorted_list<Object> & list2){
        auto i=list1.begin();
        auto j=list2.begin();
        sorted_list<Object> un;
        static sorted_list<Object>* newlist=&un;
        while(i!=list1.end() && j!=list2.end()){
            if(*i<*j){
                un.push_back(*i);
                i++;
            }
            else if(*i>*j){
                un.push_back(*j);
                j++;
            }
            else{ //if equal
                un.push_back(*i);
                i++; j++;
            }
        }
        while(i!=list1.end())
            un.push_back(*i++);
        while(j!=list2.end())
            un.push_back(*j++);
        return newlist;
    }
};

程序运行时,main中的“un”指向NULL。

int main(){
    sorted_list<int> l1;
    int i=1;
    while(i<10){
        l1.push_back(i++);
    }
    sorted_list<int>l2;
    int j=1;
    while(j<10){
        l2.push_back(j);
        j+=2;
    }
    sorted_list<int> *un = slUnion(l1,l2);
}

【问题讨论】:

  • 注意:static sorted_list&lt;Object&gt;* newlist=&amp;un; 不会在函数退出后将un 保持在作用域内并保持活动状态。你不想处理undead,所以考虑按值返回。 RVO 可能会降低成本,但如果没有,它仍然是比返回本地更好的选择。

标签: c++ list return


【解决方案1】:

您通常应该按值返回,即sorted_list&lt;Object&gt;。较新版本的 cpp 向您保证它们实际上不会复制。

您现在所做的事情是错误的,因为它具有未定义的行为。您正在使用函数堆栈上的un,并返回一个指向它的指针。到函数返回时un 已经超出范围并且内存位置可以被重用。只需完全删除newlist 指针并返回un

您似乎也对类、方法和函数感到困惑。实际上,您的方法不必在类内部,或者,由于它似乎不使用类状态,因此如果在类内部,它可以是静态的。它似乎也不必成为朋友。如果你想把它写成一个成员函数,它看起来像这样:

sorted_list<Object>& unionWith(const sorted_list<Object>& rhs) {
  // merge this and rhs w deduplication into temp, then swap temp with this
  ...

  return *this;
}

我认为您的问题可能是您没有将&amp;un 分配给newlist,而是使用&amp;un 初始化newlist。初始化只对函数静态变量执行一次,因此您的方法的未来迭代只需跳过该行,并且指针指向 un 的原始版本所在的位置。尝试将作业放在不同的行上。那应该可以解决您的直接问题,但是使用静态指针的解决方案仍然非常糟糕,因为该指针由所有实例共享。

【讨论】:

  • 该问题最初要求实现该函数,该函数位于继承的类中,并且是具有返回值 *& 的友元函数。因此,为什么我对如何返回列表或列表指针感到困惑
  • 签名中的类型是对指向 sorted_list 的指针的引用。您可以像使用指针一样使用它。这个签名很奇怪,仅供参考。
  • nitpick: union 是关键字,所以函数需要一个新名称
猜你喜欢
  • 2019-03-16
  • 1970-01-01
  • 2020-04-30
  • 2012-03-25
  • 2015-12-30
  • 1970-01-01
  • 1970-01-01
  • 2022-06-10
  • 2011-01-24
相关资源
最近更新 更多