c++ - C++中的单链表赋值运算符重载

标签 c++ singly-linked-list

我有以下单链表实现。

template <typename T> struct node{
    node(T data):data(data),next(nullptr){}
    T data;
    node<T> * next;
};

template< typename T> class slist{
    node<T>* head;
    int size;
public:
    slist(node<T>* head):head(head), size(0){}

    slist(const slist<T>& rhs){

        node<T>* temp = rhs.getHead();
        node<T>* p = new node<T>(temp->data);
        head = p;
        node<T>* current = p;
        while(temp != nullptr){
            current = current->next;
            current->data = temp->data;
        }

    }
    ~slist(){
        if(head == nullptr) return;

        while(head != nullptr){
            node<T>* current = head;
            head = head->next;
            delete(current);
        }
    }
    slist& operator= (const slist& rhs){


    }
    node<T>* getHead()const {
        return head;
    }


    void insertFront(T item){
        node<T>* p = new node<T>(item);
        if(head == nullptr){
            p = head;
            size++;
            return;
        }
        p->next = head;
        head = p;
        size++;
    }

    void insertBack(T item){
        node<T>* p = new node<T>(item);
        node<T>* current = head;
        while(current->next != nullptr){
            current = current->next;
        }
        current->next = p;
        size++;
    }

    void remove(T item){
        bool check = false;

        node<T>* current = head;
        try {
            while(current != nullptr){
                if(current->data == item) check = true;
                current = current->next;
            }
            if(!check){
                throw std::runtime_error("Item not in list");

            }
        }catch(std::runtime_error& e){
            std::cout<<e.what()<<std::endl;
            exit(-1);
        }

        current = head;
        while(current != nullptr){
           if(current->next->data == item){
               node<T>* temp = current->next;
               current->next = current->next->next;
               delete(temp);
               break;
           }
            current = current->next;
        }
        size--;

    }
    int getSize () const {
        return size;
    }

    void printList(){
        node<T>* current = head;
        while(current != nullptr){
            if(current->next != nullptr){
                std::cout<<current->data<<"->";
            }else{
                std::cout<<current->data<<std::endl;
            }
            current = current->next;
        }
    }


};

根据类的当前实现和复制构造函数,有人可以帮助解决赋值运算符重载问题。另外,我对复制构造函数和赋值重载有点困惑。我的理解是,复制构造函数创建了一个新列表,该列表与旧列表中的旧列表具有相同的值。所有节点的下一个地址都将不同,但值将相同,因为它是深拷贝。我的理解是否正确,然后赋值重载做了什么?

最佳答案

如果您已经有一个复制构造函数和析构函数,还可以实现 swap() 然后根据这三个实现您的复制赋值运算符,例如:

template <typename T>
slist<T>& slist<T>::operator= (slist<T> other) {
    this->swap(other);
    return *this;
}

请注意,参数很容易复制:与复制构造函数不同,复制赋值可以按值获取其参数。

关于语义:

  • 复制构造函数创建一个与原始对象具有相同值的新对象,例如:

    slist<int> sl1;
    // insert elements into sl1
    slist<int> sl2(sl1); // uses the copy constructor
    
  • 复制赋值将现有对象的值替换为赋值的值,例如

    slist<int> sl1;
    slist<int> sl2;
    // possibly modify both sl1 and sl2
    sl2 = sl1; // uses the copy assignment operator
    

关于c++ - C++中的单链表赋值运算符重载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33858709/

相关文章:

java - 理解链表

c - 仅删除链表中最后一个节点旁边的不存在的节点会终止程序

c++ - 程序无法启动,因为您的计算机缺少 libgcc_s_dw2-1.dll。简单控制台

c++ - 在 dev c++ 中使用 strchr(),从 'char' 到 'int' 的无效转换 [-fpermissive]

python - Qt C++ - 如何成功地将数据传递给子进程?

c - 是否可以在不借助自引用结构的情况下构建链表?

java-用节点理解LinkedList面试题

两个不同 vector 中的 C++ 相同对象

c++ - 如何设计这个易于修改的程序?

c++ - 如何将 2 个链接列表组合或合并在一起以创建一个新列表?