2017-09-17 43 views
-1

我對數據結構課程有以下作業分配。爲指針數組重載比較運算符

使用指針數組設計並實現有序列表類。這個類應該是一個模板。 該模板預計會超載運營商>,<==

  1. 該類應該有一個包含20個項目的數組。
  2. AddItem方法應該從數組的前面開始搜索插入新項目的位置。
  3. RemoveItem方法應該確保數組中的項目仍然有序並且項目之間沒有空白點。
  4. 該類應包括IsEmpty,IsFullMakeEmpty方法。

我有一個有序列表類的工作實現的,但轉讓說,我的模板類應該重載一些比較運營商,我不知道爲什麼我需要做的。我讀過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

StackOverflow不會爲你做你的功課。 – Charles

+1

當你用C++編程時,你不想有像_ pointers_指針一樣的東西。沒有必要有這樣的。 – user0042

+0

謝謝,@Charles。我只是想了解**爲什麼**我需要在這裏重載操作符。我讀過https://meta.stackoverflow.com/questions/334822/how-do-i-ask-and-answer-homework-questions,並相信我遵循所有的指導原則。我做出了一個誠意的努力來解決問題,正在詢問關於我的實施的具體問題,並將其明確標識爲作業。 – Rob

回答

0

聲明:我無法讀懂你的導師的想法,下面是我對你任務的最好詮釋。

該作業要求您執行平等測試。檢查任何兩件事情的平等應該是直觀明顯的。如果兩個列表按照相同的順序包含相同的元素,則它們是相等的。把你的列表看作單詞,將你的列表元素看作字母。如果你可以比較字母,你會如何決定兩個單詞是否相同?

該作業還希望您執行訂購測試<>。這可能不那麼直觀,但實際上有一個明確定義的列表排序的概念,稱爲字典排序。再次,將您的列表視爲單詞,將您的列表元素視爲字母。你如何決定在詞典中哪一個詞先於另一個?這是詞典排序。

比較兩個單詞是有意義的,但將一個單詞與一個字母進行比較是沒有意義的。看看你的重載操作符簽名。你如何修改它們,使它們更類似於比較兩個單詞?

+0

啊!這是一個有趣的見解。我對這方面的知識是相當有限的,但是你是否建議比較運算符重載以比較整個列表而不是列表中的項目? – Rob

+0

比較列表中的項目將在其他地方完成。您不必定義兩個'T'實例之間的比較。 – Charles

+0

@Rob是我已經添加了這個答案。 –