重载指针数组的比较运算符

时间:2017-09-17 18:00:44

标签: c++ pointers operator-overloading

我有以下数据结构课程作业。

  

使用指针数组设计并实现有序列表类。这个类应该是一个模板。 该模板预计会使><==运营商超载。

     
      
  1. 该类应该有一个包含20个项目的数组。
  2.   
  3. 在搜索插入新项目的位置时,AddItem方法应从数组的前面开始。
  4.   
  5. RemoveItem方法应该确保数组中的项目仍然有序且项目之间没有空白点。
  6.   
  7. 该课程应包含IsEmptyIsFullMakeEmpty方法。
  8.   

我有一个有序列表类的工作实现,但是赋值说我的模板类应该重载一些比较运算符,我不知道为什么我需要这样做。我已阅读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的检查,但我不确定这是否可能。

1 个答案:

答案 0 :(得分:0)

免责声明:我无法阅读您的导师的想法,以下是我对您的任务的最佳解释。

作业要求您实施相等测试。检查任何两件事的平等应该是直观明显的。如果两个列表包含相同顺序的相同元素,则它们是相等的。将您的列表视为单词,将列表元素视为字母。如果你可以比较字母,你会如何判断两个单词是否相同?

该作业还希望您实施排序测试<>。这可能不太直观,但实际上有一个明确定义的列表排序概念,称为词典排序。再次,将您的列表视为单词,将列表元素视为字母。你怎么决定在字典中哪两个单词出现在另一个单词之前?这是字典顺序。

比较两个单词是有意义的,但将单词与字母进行比较是没有意义的。查看重载的操作员签名。你如何修改它们以使它们更像是比较两个单词?