2017-08-30 55 views
5

我們假設我們正在實現一個自定義集合,其行爲類似於向量,並且如果集合爲空,我們想讓operator[]引發一些異常。 std::vector在這種情況下有未定義的行爲,但我們想拋出異常。如果這是C#,我們可能會投擲InvalidOperationException。但在這種情況下哪個C++ exception會是最合適/直觀的?我覺得std::out_of_range不是最好的選擇,因爲集合是空的,所以沒有「範圍」,索引將返回一個有效的(任何)元素。當對象的當前狀態不允許嘗試對其執行操作時拋出哪個異常?

+2

其實我認爲'std :: out_of_range'確實是我會使用的異常。如果容器是空的,那麼任何索引超出範圍,這與'std :: vector'已經運行的方式相同。記住一個空集仍然是一組(在數學意義上) – CoryKramer

+0

恕我直言,我認爲每個人都會明白你對'std :: out_of_range'的使用。即使您鏈接到的參考站點也有*定義了要拋出的對象類型作爲例外。它報告錯誤,這是嘗試訪問超出定義範圍的元素的結果。*非常適合這種情況。 – NathanOliver

+2

vector :: at'會在vector爲空時拋出'std :: out_of_range',所以我相信這確實是一個正確的例外。 – SirDarius

回答

4

std::vector::at已經這樣做了。因此,您可以使用at方法而不是operator []。它爲無效索引投擲std::out_of_range

請注意,您將不得不做大量的工作來實現std::vector的性能。但是,如果你想堅持自己的容器,並想從[],然後像at方法std::out_of_range是標準異常類的最佳選擇。否則,你需要定義你自己的自定義異常類。

+1

謝謝@taskinoor。我一直在執行這個定製集合,就像一個練習......所以這更像是一個假設性問題。除非有很好的理由這麼做,否則我肯定會避免在商業/生產軟件的情況下這樣做。 –

+1

@BojanKomazec爲了學習的目的,它完全沒問題,恕我直言。關閉主題評論:請看看'std :: allocator',您可能需要避免不必要的默認構造函數調用,並移動您可能需要的有效增長操作的語義。 – taskinoor

相關問題