我有一个双重链接列表的代码,并且该代码的行数很少,这个想法并不清楚。我要求专家评论下面有评论的行。这是我上次使用C ++的时间。我指出的只有两行对我来说是不可理解的。
template <typename T>
class double_linked
{
struct node
{
T data;
node* prev;
node* next;
node(T t, node* p, node* n) : data(t), prev(p), next(n) {}
};
node* head;
node* tail;
public:
double_linked() : head( NULL ), tail ( NULL ) {}
template<int N>
double_linked( T (&arr) [N]) : head( NULL ), tail ( NULL )
{
for( int i(0); i != N; ++i)
push_back(arr[i]);
}
bool empty() const { return ( !head || !tail ); } // this doing?
operator bool() const { return !empty(); } // this doing? i know operators need in C++ but dont know the use of it here
void push_back(T);
void push_front(T);
T pop_back();
T pop_front();
~double_linked()
{
while(head)
{
node* temp(head);
head=head->next;
delete temp;
}
}
};
答案 0 :(得分:1)
operator bool() const
是转换运算符。如果在需要bool的上下文中使用double_linked
的实例,则将调用此函数来执行转换。 (如果列表在您的情况下不为空,则评估为true
。)
另一个函数是一个普通的旧函数,如果true
或head
为空,它将返回tail
。
有关转换运算符的详情,请参阅:How do conversion operators work in C++?
答案 1 :(得分:1)
第一个是确定列表是否为空的函数。在双向链表中,如果您至少有一个元素,那么head
和tail
指针(分别指向列表的开头和结尾)必须点到一个有效的元素。因此,您可以通过测试这两个指针是否指向有效元素(即null
)来测试列表是否为空。这就是表达式!head || !tail
的作用 - 检查指针是否为null
,如果是,则列表为空。
operator bool()
是转化运算符。它基本上意味着,无论何时将列表强制转换为bool
,都会调用该函数,并将结果用作bool
的值。该函数返回列表是否为空,因此如果列表不为空,则bool result = myList;
这样的表达式会使result
为true
。
答案 2 :(得分:0)
这是一个谓词告诉我们它是否为空,它正在检查指针是否为0(null)。
bool empty() const { return ( !head || !tail ); } // this doing?
这允许用户将容器的实例化视为布尔值,如果它不为空则为true。
operator bool() const { return !empty(); } // this
实现链表是一个很好的编程练习,但如果你想在实际代码中使用链表,那么你应该使用std :: list(in)。