基于模板的链表 - 在搜索操作中应该返回什么?
Template based Linked List - What should be Returned in search operation?
我正在使用模板并定义了以下模板化的 ListNode。
template <typename T>
class ListNode{
private :
public:
ListNode *left;
ListNode *right;
T data;
ListNode(T data){ this->data = data; }
};
如果我使用以下原型在此链表上实现搜索操作,函数的 return 值应该是什么。如果 T 是一个指针,我可以 return NULL,但是如果 T 是一个 Complete 对象,那么 return 类型应该是什么,我如何区分 T 是一个指针还是一个 Complete 对象。此搜索功能如何适用于 T,其中 T 可以是指针或完整对象。
T List_search(T srch_data);
T List_search(T srch_data) {
ListNode<T> *curr = head;
while (curr) {
if (comp_fn.compare_data (curr->data, srch_data) == 0)
return curr->data;
curr = curr->right;
}
return NULL; <<< Compilation error if T is complete object
}
一个选项是让事情简单化:return 找到的项目的地址,nullptr
如果找不到该项目:
template <typename T>
T* List_search(T srch_data)
{
ListNode<T> *curr = head;
while (curr)
{
if (comp_fn.compare_data (curr->data, srch_data) == 0)
return &curr->data;
curr = curr->right;
}
return nullptr;
}
然后客户端将检查 nullptr
,如果不是 nullptr
,则可以取消引用指针。
比如链表节点持有一个int
类型:
int* foundData = List_search(10)
if ( foundData )
{
std::cout << *foundData;
}
我正在使用模板并定义了以下模板化的 ListNode。
template <typename T>
class ListNode{
private :
public:
ListNode *left;
ListNode *right;
T data;
ListNode(T data){ this->data = data; }
};
如果我使用以下原型在此链表上实现搜索操作,函数的 return 值应该是什么。如果 T 是一个指针,我可以 return NULL,但是如果 T 是一个 Complete 对象,那么 return 类型应该是什么,我如何区分 T 是一个指针还是一个 Complete 对象。此搜索功能如何适用于 T,其中 T 可以是指针或完整对象。
T List_search(T srch_data);
T List_search(T srch_data) {
ListNode<T> *curr = head;
while (curr) {
if (comp_fn.compare_data (curr->data, srch_data) == 0)
return curr->data;
curr = curr->right;
}
return NULL; <<< Compilation error if T is complete object
}
一个选项是让事情简单化:return 找到的项目的地址,nullptr
如果找不到该项目:
template <typename T>
T* List_search(T srch_data)
{
ListNode<T> *curr = head;
while (curr)
{
if (comp_fn.compare_data (curr->data, srch_data) == 0)
return &curr->data;
curr = curr->right;
}
return nullptr;
}
然后客户端将检查 nullptr
,如果不是 nullptr
,则可以取消引用指针。
比如链表节点持有一个int
类型:
int* foundData = List_search(10)
if ( foundData )
{
std::cout << *foundData;
}