[英]Handling Out-of-Range Indices
對於容器類,當類的用戶嘗試設置超出類大小的值時,預期的行為應該是什么?
有問題的方法是“替換”方法(如operator[]
),而不是“add”方法(如operator+=
)。
我可以拋出一個out_of_range
異常,或者我可以調整容器大小以適應添加。
超出范圍的異常在這里更合適,因為“替換”語義通常意味着調用者假定/斷言在指定的索引處存在數據,而沒有。
對於std::vector::operator[]
,域錯誤會導致未定義的行為。 對於std::map::operator[]
,域錯誤會創建一個新條目。 我想設計問題是:
擴展容器有多貴? 也就是說,你可以只創建一個項目(比如map::operator[]
),或者你是否必須創建所有介入的項目(如vector::operator[]
)
與訪問功能相比,范圍檢查有多貴? 在map
,一旦運行了訪問功能,范圍檢查就是免費的。 在vector
,范圍檢查大約使訪問成本增加一倍。
由於您正在設計容器,因此請隨意使用適合您和您的客戶的任何模式。 請務必記錄行為。
一般來說,我更喜歡拋出超出范圍的異常。 如果用戶確實想要擴展存儲,請為他們提供一種方法。 這將消除許多無意的擴展,這可能導致更嚴重的錯誤。 這只是我的看法。
尚未提及的一點是,提供特殊的一對一案例以擴展班級規模有時可能是有用的。 這個想法是一個類可能有一個不變的項目[0]到項目[length-1]都已被有效地分配。 如果有人試圖寫入項目[K],K> = length + 1,則可能需要創建具有未知值的新項[length..K-1],從而打破類不變量。 另一方面,如果一個人寫入item [length],則可以將長度增加一個並保持類不變。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.