我有以下数据结构课程作业。
使用指针数组设计并实现有序列表类。这个类应该是一个模板。 该模板预计会使
>
,<
和==
运营商超载。
- 该类应该有一个包含20个项目的数组。
- 在搜索插入新项目的位置时,
AddItem
方法应从数组的前面开始。RemoveItem
方法应该确保数组中的项目仍然有序且项目之间没有空白点。- 该课程应包含
醇>IsEmpty
,IsFull
和MakeEmpty
方法。
我有一个有序列表类的工作实现,但是赋值说我的模板类应该重载一些比较运算符,我不知道为什么我需要这样做。我已阅读What are the basic rules and idioms for operator overloading?,但不知道如何在此处应用。
这是我目前的解决方案:
#include <cstddef>
#include <iostream>
using namespace std;
#define LEN 20
template <class T> class orderedList
{
protected:
T *arr[LEN] = {}; // Array of pointers
public:
void addItem(T item);
void removeItem(T item);
bool isEmpty();
bool isFull();
void makeEmpty();
bool operator<(const T& rhs) const;
bool operator>(const T& rhs) const;
bool operator==(const T& rhs) const;
};
// Overloaded comparison operators
template <class T> bool orderedList<T>::operator<(const T& rhs) const {
return this < rhs;
}
template <class T> bool orderedList<T>::operator>(const T& rhs) const {
return rhs < this;
}
template <class T> bool orderedList<T>::operator==(const T& rhs) const {
return this == rhs;
}
template <class T> void orderedList<T>::addItem(T item)
{
T temp1 = item;
T temp2;
for (int i=0; i<LEN; i++) {
if(arr[i] == NULL) {
arr[i] = new T;
*arr[i] = temp1;
return;
} else if (*arr[i] > item) {
temp2 = *arr[i];
*arr[i] = temp1;
temp1 = temp2;
} else {
continue;
}
}
cout << "full error!" << endl;
}
template <class T> void orderedList<T>::removeItem(T item)
{
int cur = 0;
while( cur<LEN && arr[cur] != NULL && item > *arr[cur]) {
cur++;
}
if (*arr[cur] == item) {
while(cur+1<LEN && arr[cur+1] != NULL) {
*arr[cur] = *arr[cur+1];
cur++;
}
delete arr[cur];
arr[cur] = NULL;
} else {
cout << "not found error!" << endl;
}
}
template <class T> bool orderedList<T>::isEmpty()
{
for(int i=0; i<LEN; i++) {
if (arr[i] != NULL)
return false;
}
return true;
}
template <class T> bool orderedList<T>::isFull()
{
// Traverse in reverse for speed
for(int i=LEN-1; i>0; i--) {
if (arr[i] == NULL)
return false;
}
return true;
}
template <class T> void orderedList<T>::makeEmpty()
{
for(int i=0; i<LEN; i++) {
if (arr[i] != NULL) {
delete arr[i];
arr[i] = NULL;
}
}
}
这似乎有效,但重载的比较运算符没有做任何特殊的事情,也没有看到他们需要的任何理由。我最好的猜测是我应该尝试在比较运算符中包含对NULL
的检查,但我不确定这是否可能。
答案 0 :(得分:0)
免责声明:我无法阅读您的导师的想法,以下是我对您的任务的最佳解释。
作业要求您实施相等测试。检查任何两件事的平等应该是直观明显的。如果两个列表包含相同顺序的相同元素,则它们是相等的。将您的列表视为单词,将列表元素视为字母。如果你可以比较字母,你会如何判断两个单词是否相同?
该作业还希望您实施排序测试<
和>
。这可能不太直观,但实际上有一个明确定义的列表排序概念,称为词典排序。再次,将您的列表视为单词,将列表元素视为字母。你怎么决定在字典中哪两个单词出现在另一个单词之前?这是字典顺序。
比较两个单词是有意义的,但将单词与字母进行比较是没有意义的。查看重载的操作员签名。你如何修改它们以使它们更像是比较两个单词?