2011-03-17 59 views
2

對於容器類,當類的用戶試圖設置超出類的大小的值時,預期的行爲應該是什麼?處理超出範圍的索引

有問題的方法是「替換」方法(如operator[]),而不是「添加」方法(如operator+=)。

我可以拋出out_of_range異常,或者我可以調整容器的大小以適應添加。

回答

4

超出範圍的異常在這裏更合適,因爲「替換」語義通常意味着調用者正在假設/斷言指定索引處有數據,而沒有數據。

+2

+1:我知道我們在這裏討論的是C++,但是*顯式優於隱式*仍然適用。 – 2011-03-17 14:14:56

1

一般來說,我寧願拋出超出範圍的異常。如果用戶真的想擴大存儲空間,請爲他們提供一種方法。這將消除許多無意的擴展,這可能導致更嚴重的錯誤。這只是我的看法。

3

對於std::vector::operator[],域錯誤導致未定義的行爲。對於std::map::operator[],域錯誤會創建一個新條目。我猜設計的問題是:

  • 擴展容器的代價是多大?也就是說,你只能創建一個項目(如map::operator[]),或者你必須創建所有干預項目(如vector::operator[]

  • 有多貴範圍檢查,相較於接入功能?在map中,一旦您運行訪問功能,範圍檢查就會自由。在vector範圍檢查大約加倍訪問的成本。

由於您正在設計集裝箱,隨時可以強加適合您和您的客戶的任何模式。只要確保記錄行爲。

1

尚未提及的一點是,提供特殊的一次性案例來延長班級規模可能有用。這個想法是,一個類可能有一個不變的項目[0]到項目[length-1]全部被有效地分配。如果試圖寫入項目[K],並且K> = length + 1,則可能需要創建具有未知值的新項目[length..K-1],從而破壞類不變量。另一方面,如果寫入項目[length],則可以將長度增加1並保持類不變。