3

所以,我決定回頭看一些數據結構,以使自己保持鋒利;)C++鏈接列表:超載括號運算[]

我開始實施一個哈希表,當我想起我需要鏈表的這樣我就可以避免散列衝突。所以我開始我的鏈表...

我實現了我的鏈表類(add,get,remove等)的所有功能方法,然後我決定嘗試一些我沒試過的東西之前。重載數組索引操作符,以便可以檢索或分配鏈接列表索引,就像鏈接列表是數組一樣。

我取出部分工作沒有問題:

template <class T> 
T LinkedList<T>::operator[](const int &i) { 
    return get(i); 
} 

get函數返回相關節點的數據,而不是節點本身...二傳手應該表現在那裏提供的值被存儲到給定索引處的節點的數據屬性...我的願景是,用戶不必觸碰ListNode類。

我的最終目標是,我可以有一個聰明的LinkedList是會像這樣:

LinkedList<int> list; 

list[0] = 1; //Allocates memory for 0th node and stores 1 as the data 
list[3] = 2; //Allocates memory for 1th,2th,and 3th nodes and sets 2 as the data 
       //Unassigned nodes should use default constructors on data 

int a = list[3]; //Sets a to 2 
cout << list[0] << endl; //prints 1 

吸氣工作正常,但我有在二傳手的麻煩。假設已完成所有索引錯誤檢查和內存分配的設置函數。任何幫助,將不勝感激。如果不可能,請在我花更多時間之前告訴我。謝謝。

+0

由於getter函數必須作爲迭代實現,因此似乎無足輕重添加setter。不過,我認爲這個界面會很笨重。在上面的例子中,碰撞列表的期望大小是多少?我(作爲用戶)如何知道兩個項目[1,2]是「空的」?如何計劃保持聯繫清除,正弦恆定時間清除是鏈接列表的主要好處之一? – Chad

回答

3

它看起來像你想通過引用返回節點:

template <typename T> 
class LinkedList { 
... 
    T& operator[](const size_t& i) { return this->get(i); } 
    const T& operator[](const size_t& i) const { return this->get(i); } 
... 
}; 

(還假定LinkedList::get()返回引用)

+0

'const size_t&i'沒有多大意義,因爲它不是必需的。 'size_t我'足夠了。 – Nawaz

+0

啊,過去一直在想......這工作:) – jyore

+0

@Nawaz const ref也足夠了。它對我來說足夠有意義,它是我的默認值,而不是價值。 – justin

1

operator[]get()應該返回到數據的引用。

template <class T> 
T& LinkedList<T>::operator[](const int &i) { 
    return get(i); 
}