C++ 两个排序列表的交集和并集(返回类型)

C++ 两个排序列表的交集和并集(返回类型),c++,list,return,C++,List,Return,此代码用于查找两个排序列表的交集和并集。中的排序列表继承自包含所有基本函数的列表类。主要问题是函数的返回类型是什么。 它是指向列表的指针还是列表本身?如何显示“指针”的内容 模板 类列表:公共列表{ 好友排序列表*&列表(常量排序列表&列表1,常量排序列表&列表2){ 自动i=list1.begin(); auto j=list2.begin(); 已排序的列表un; 静态排序的_列表*newlist=&un; 而(i!=list1.end()&&j!=list2.end()){ 如果(*i*j

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

模板
类列表:公共列表{
好友排序列表*&列表(常量排序列表&列表1,常量排序列表&列表2){
自动i=list1.begin();
auto j=list2.begin();
已排序的列表un;
静态排序的_列表*newlist=&un;
而(i!=list1.end()&&j!=list2.end()){
如果(*i*j){
un.推回(*j);
j++;
}
else{//如果相等
un.推回(*i);
i++;j++;
}
}
而(i!=list1.end())
un.推回(*i++);
而(j!=list2.end())
un.推回(*j++);
返回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);
}
intmain(){
排序列表l1;
int i=1;

而(i通常应按值返回,即
排序列表
。较新版本的cpp保证不会实际复制

您现在所做的是错误的,因为它有未定义的行为。您正在使用函数堆栈上的
un
,并返回指向它的指针。当函数返回
un
时,它已超出范围,并且可以重用内存位置。只需完全删除
newlist
指针并返回它rn
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;
}
sorted_list&unionWith(常量排序_list&rhs){
//将此和rhs w重复数据消除合并到temp中,然后将temp与此进行交换
...
归还*这个;
}

我认为您可能存在的问题是,您没有将
&un
赋值给
newlist
,而是使用
&un
初始化
newlist
。函数静态变量的初始化只执行一次,因此方法的后续迭代只跳过该行,指针指向原始版本所在的位置
un
的sion是。尝试将分配放在另一行上。这应该可以解决您眼前的问题,但使用静态指针的解决方案仍然非常糟糕,因为指针由所有实例共享。

您知道吗?注意:
静态排序列表*newlist=&un;
不会将
un
保留在范围和范围内在函数退出后活着。您不想处理“代码> UN/<代码>死亡,因此考虑按值返回。RVO可能会降低成本,但如果不这样,它仍然比返回本地选项更好。问题最初要求实现继承的类中的函数,并且是朋友函数。返回值*&。因此,为什么我对如何返回列表或列表指针感到困惑签名中的类型是对指向已排序列表的指针的引用。您可以像使用指针一样使用它。此签名非常奇怪,仅供参考。挑剔:
union
是一个关键字,因此函数需要一个新名称
sorted_list<Object>& unionWith(const sorted_list<Object>& rhs) {
  // merge this and rhs w deduplication into temp, then swap temp with this
  ...

  return *this;
}