C ++中双向链表的赋值运算符

时间:2016-10-16 19:22:54

标签: c++ linked-list assignment-operator

我无法绕过赋值运算符的概念,或者至少成功创建它们。

复制构造函数对我来说不是问题;这是我的工作:

//copy constructor
Set::Set(const Set &rhs){
    _head = rhs._head;
    _tail = rhs._tail;

    //null, basically this object is 0
    if(rhs._head == NULL){
        _head = NULL;
        _tail = NULL;
        _size = 0;
    }else{
        _head = new Elem(*rhs._head);
        _tail = new Elem(*rhs._tail);
        _size = rhs._size;

        Elem *prev = NULL;
        Elem *curr = _head;
        Elem *otherCurr = rhs._head;
        int counter = 0;
        while(otherCurr->next != NULL){
            curr->next = new Elem(*otherCurr->next);
            curr->next->prev = curr;


            curr = curr->next;
            otherCurr = otherCurr->next;
        }

        //now that we are done lets setup the tail
        _tail->prev = curr;
        curr->next = _tail;

    }

}

我正在阅读示例代码,并看到有些人使用#include <algorithm>库来实现它。我试过了,但似乎根本没有用。

//assignment operator
Set& Set::operator=(const Set &rhs){
    Set temp(rhs);
       std::swap(temp._head,_head);
       std::swap(temp._tail, _tail);
       return *this;

}

以上代码无法正常工作。真的很难掌握如何制定赋值运算符的概念。我认为它基本上可以像你想要将值从一个复制到另一个。但显然不是。如果有人可以告诉我如何使其工作,那将会很棒。

我的课程中有一些更一般的信息,a _heada _tail指向列表的开头和结尾。虚拟元素。

以下是对象的结构:

  struct Elem {
        ELEMENT_TYPE info;
        Elem *prev, *next;
    };
    Elem *_head, *_tail;
    int _size;

1 个答案:

答案 0 :(得分:0)

我发现你的拷贝构造函数存在两个问题(甚至没有尝试进一步挖掘):

  1. 尾巴的目的是什么?它似乎不需要,或者使用不正确。
  2. 您的副本循环似乎停在otherCurr-&gt;上,然后是NULL。但是你将最后一个元素的curr-&gt;指向尾部。这很可能意味着您要么将1个元素复制到您的集合之后,要么更糟糕(因为您可能无法正确地初始化尾部查看其定义),您正在尝试复制随机位置,这会导致程序迟早崩溃。 / LI>