我想在我的链表实现中使用一个标记来简化一些功能。
然而,Deque() = default;
构造函数让我很困惑。
它如何知道它必须设置head = tail后跟一个哨兵 当我没有/不能定义它时,没有元素的Deque链表的初始构造?
这只是我正在努力学习和理解的课程之一。我们没有被要求使用哨兵,但我想。
Deque.cpp
//2 example functions using sentinels
#include "Deque.h"
#include <iostream>
#include <memory>
using std::cout;
using std::endl;
bool Deque::empty() const
{
if ((head->next == tail) && (tail->next == sentinel))
{return true;}
return false;
}
int Deque::size() const
{
int size_val = 0;
const Node* p = head.get();
while ( p != sentinel)
{
size_val++;
p = p->next.get();
}
return size_val;
}
Deque.h
#include "Node.h"
#include <memory>
class Deque{
public:
Deque() = default;
Deque(const Deque&);
~Deque(); // const space
Deque& operator=(const Deque&);
bool empty() const;
int size() const;
private:
friend Node;
std::unique_ptr<Node> sentinel;
std::unique_ptr<Node> head ;
std::unique_ptr<Node> tail ;
};
Node.h
#ifndef NODE_H
#define NODE_H
#include <iostream>
#include <memory>
class Node {
public:
Node(const Node& n) : val{n.val}, next{}
{
}
Node(int v, std::unique_ptr<Node> n) : val{v}, next{move(n)}
{
}
Node(int v) : val{v}
{
}
private:
int val = 0;
std::unique_ptr<Node> next = nullptr;
friend class Deque;
friend std::ostream& operator<<(std::ostream&, const Node&);
};
#endif