gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 04:23:12 26 4
gpt4 key购买 nike

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

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

最佳答案

您通常应该按值返回,即 sorted_list<Object> .较新版本的 cpp 向您保证它们实际上不会制作拷贝。

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

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

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

return *this;
}

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

关于c++ - 两个排序列表的交集和并集(返回类型),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54991824/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com