由於C++數組和向量中的at()
函數提供了越界檢查,並且在使用operator[]
時沒有顯着的性能差異,是否應該使用括號來訪問數組?我應該使用括號[]還是.at()來訪問數組?
也許只有在性能關鍵的代碼?
由於C++數組和向量中的at()
函數提供了越界檢查,並且在使用operator[]
時沒有顯着的性能差異,是否應該使用括號來訪問數組?我應該使用括號[]還是.at()來訪問數組?
也許只有在性能關鍵的代碼?
你不應該使用它們中的任何一個。 std::vector
提供了迭代功能,這些功能很少通過索引顯式訪問項目。
要回答你的問題,下面不支付你不使用,如果你知道你是不會去出界,沒有必要使用at()
。
否則,如果您確定這是一個有效的指針,您應該每次檢查一個指針時不要使用nullptr
,但實際上您不會這樣做。
什麼是std :: vector迭代功能?你介意提供一個鏈接還是進一步描述? –
'
當您確定不會出現「越界」訪問時,您應該使用[]
。
你應該使用at()
當「出界」訪問可以發生,你正在準備或者處理與(通過捕獲異常,並做一些合理的),或者你的程序崩潰是確定的(這無論如何都會有你用[]
,只是以一個未定義的方式)。
後來從(i)改變爲操作員是相當麻煩的。所以我同意Jesper。
要解決界限問題,您可以要麼使用valgrind,要麼使用GCC編譯時使用-D_GLIBCXX_DEBUG。有關更多信息,請參閱GCC Debug mode。
這可能是一種痛苦,但如果你沒有這些調試工具,那就更加痛苦了,而選擇是通過嘗試和解決問題用'at()'替換一些'[]'調用,或花費幾個小時調試。 – PaulMcKenzie
使用assert進行邊界檢查而不是at()會更好嗎?由於斷言將在發佈版本中被刪除? –
@ J-Win'assert()'的問題是*在發佈版本中被刪除。如果該錯誤僅在發佈版本中出現,該怎麼辦? – PaulMcKenzie
我不認爲你應該從at()
開始,因爲我們確信我們的程序沒有邊界訪問問題。因此我們立即開始使用[ ]
。然而,如果我們通過SO上的帖子(由通常新的程序員)來訪問,關於向量訪問的許多問題可以很容易地解決,如果at()
被用來檢測邊界問題。
鑑於此經驗,如果懷疑出現界限,或者有暗示可能會出界,請使用at()
進行調試。
既然你是一個很好的人,你會知道你的指標是否在界限內,並且你不需要向量冗餘地檢查你。使用方括號。 –
_「使用運算符[]並沒有顯着的性能差異,而是使用[] [需要的引用] –