C++ +;=操作重载、自连接
首先,请原谅,代码太长,是从code::blocks复制的,因此没有缩进,我使用了pastebin,这是类: 在这个类中,我有一个列表,+=运算符重载如下:C++ +;=操作重载、自连接,c++,C++,首先,请原谅,代码太长,是从code::blocks复制的,因此没有缩进,我使用了pastebin,这是类: 在这个类中,我有一个列表,+=运算符重载如下: List<T>& operator+= (List<T>& l) { List<T>* ptr; ptr=l.next; while(ptr!=&l) { this->push(*ptr->info); p
List<T>& operator+= (List<T>& l)
{
List<T>* ptr;
ptr=l.next;
while(ptr!=&l)
{
this->push(*ptr->info);
ptr=ptr->next;
}
return (*this);
}
List和operator+=(List和l)
{
列表*ptr;
ptr=l.next;
while(ptr!=&l)
{
此->推送(*ptr->信息);
ptr=ptr->next;
}
返回(*本条);
}
问题在于自连接,假设我有一个列表l1,这个列表中有一些值。如果我说:l1+=l1,试图编译一个程序,我看到程序进入无限循环。
我试图对此进行推理,因为参数是l1,通过引用调用,因此this==&l是有效的。
所以ptr指向l.next,也指向this->next。
我读取所有信息并将值推送到列表中,我不知道为什么它会进入无限循环,我不知道。似乎您正在实现
列表,因此您可以访问其内部:只需在复制列表的过程中实现串联:
复制作为参数传递的列表
将副本的开头附加到当前列表的结尾
从副本中删除列表,以避免移动节点的真实性
从外观上看,你无法区分lust和它的节点:虽然这是可行的,但如果你有一个指向节点序列的列表句柄,通常效果会更好。使用调试器和单步执行。注意列表的大小。当列表的大小翻倍时,ptr
的值是多少?列表中最初的最后一个节点的ptr->next
发生了什么事?列表的大小增加了,如果我让它保持几秒钟,我会得到大约25000个大小。想想我的另外两个问题。是的,修改最后一个结束节点是避免问题的好方法。我可以复制,但是我不明白为什么它不起作用。另外,我知道我什么时候得到最后一个节点,因为这个节点信息是一个空指针。我曾想过使用一系列迭代器,例如forstd::list
,但我怀疑这可能会有一个移动的结尾!也就是说,即使只获取一次end()
迭代器,它也永远不会到达。每次附加节点时,列表都会变长一个元素。也就是说,当您将列表的第一个元素追加到它的末尾时,您仍然需要做与追加它之前一样多的工作。这永远不会改变,除非你知道哪一个是原始列表的结尾,停在那里。当您到达该元素时,该元素中的NULL早已消失。@DietmarKühl:非常确定您需要保存end()-1
或rbegin()
。