0

我最近学习了左值和右值引用、通用引用、完美转发、std::move()、std::forward() 等概念。

我尝试实现 Stack 的模板化版本(使用链接列表)并且想知道如何在我的程序中正确有效地使用上述概念。

我希望利用移动语义

注意:我自己确实尝试过这样做,但似乎没有正确解决! 我在我认为可以的地方评论了//possible use并尝试自己使用上述概念!

我不会提及我的混乱代码版本,因为我觉得它太错误了。相反,如果有人可以在我的原始代码中指导或帮助我,我将不胜感激。任何反馈表示赞赏!

#include <iostream>
using namespace std;

template <class U>
struct Stack_Node
{
    U data;
    Stack_Node *next;
    Stack_Node(U val) // possible use
        : data(val), next(nullptr)
    {
        cout << "\nNew Stack_Node Created!\n";
    }
};

template <class T>
class Stack
{
private:
    Stack_Node<T> *head;

public:
    Stack() : head(nullptr) { cout << "\nNew Stack Created!\n"; }
    ~Stack()
    {
        while (head != nullptr)
        {
            Stack_Node<T> *ptr = head;
            head = head->next;
            delete ptr;
        }
    }

    bool empty() { return head == nullptr; }

    size_t size()
    {
        size_t count = 0;
        Stack_Node<T> *ptr = head;
        while (ptr != nullptr)
        {
            ++count;
            ptr = ptr->next;
        }
        return count;
    }

    T &top() { return head->data; }

    void push(T val) // possible use
    {
        Stack_Node<T> *ptr = new Stack_Node<T>(val); // possible use
        ptr->next = head;
        head = ptr;
    }

    void pop()
    {
        if (empty())
            return;
        Stack_Node<T> *ptr = head;
        head = head->next;
        delete ptr;
    }
};

template <class T>
void print(Stack<T> &s)
{
    Stack_Node<T> *ptr = s.head;
    while (ptr != nullptr)
    {
        cout << ptr->data << " ";
        ptr = ptr->next;
    }
}

int main()
{
}

编辑: 1. 我可以像这样使用 Rvalue 参考:-

void push(T &&val) // HERE !!!
{
     Stack_Node<T> *ptr = new Stack_Node<T>(val); // possible use
     ptr->next = head;
     head = ptr;
}

但是,如果我希望传递 Lvalues,我将不得不std::move()在调用push()函数时使用,但我希望我的Stack类保持一个黑盒,这样用户就不必担心使用移动语义......我的类应该通过利用移动语义,仍然可以以最有效的方式工作。

4

0 回答 0