我最近学习了左值和右值引用、通用引用、完美转发、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
类保持一个黑盒,这样用户就不必担心使用移动语义......我的类应该通过利用移动语义,仍然可以以最有效的方式工作。