簡體   English   中英

處理超出范圍的指數

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM