2016-07-06 66 views
1

由於C++數組和向量中的at()函數提供了越界檢查,並且在使用operator[]時沒有顯着的性能差異,是否應該使用括號來訪問數組?我應該使用括號[]還是.at()來訪問數組?

也許只有在性能關鍵的代碼?

+1

既然你是一個很好的人,你會知道你的指標是否在界限內,並且你不需要向量冗餘地檢查你。使用方括號。 –

+2

_「使用運算符[]並沒有顯着的性能差異,而是使用[] [需要的引用] –

回答

5

你不應該使用它們中的任何一個。 std::vector提供了迭代功能,這些功能很少通過索引顯式訪問項目。

要回答你的問題,下面不支付你不使用,如果你知道你是不會去出界,沒有必要使用at()

否則,如果您確定這是一個有效的指針,您應該每次檢查一個指針時不要使用nullptr,但實際上您不會這樣做。

+0

什麼是std :: vector迭代功能?你介意提供一個鏈接還是進一步描述? –

+0

''頭文件提供了幾乎所有關於STL容器的函數,而不需要循環遍歷一個'std :: vector'並通過索引檢索對象。 http://en.cppreference.com/w/cpp/algorithm – Jack

4

當您確定不會出現「越界」訪問時,您應該使用[]

你應該使用at()當「出界」訪問可以發生,你正在準備或者處理與(通過捕獲異常,並做一些合理的),或者你的程序崩潰是確定的(這無論如何都會有你用[],只是以一個未定義的方式)。

2

後來從(i)改變爲操作員是相當麻煩的。所以我同意Jesper。

要解決界限問題,您可以要麼使用valgrind,要麼使用GCC編譯時使用-D_GLIBCXX_DEBUG。有關更多信息,請參閱GCC Debug mode

+0

這可能是一種痛苦,但如果你沒有這些調試工具,那就更加痛苦了,而選擇是通過嘗試和解決問題用'at()'替換一些'[]'調用,或花費幾個小時調試。 – PaulMcKenzie

+0

使用assert進行邊界檢查而不是at()會更好嗎?由於斷言將在發佈版本中被刪除? –

+0

@ J-Win'assert()'的問題是*在發佈版本中被刪除。如果該錯誤僅在發佈版本中出現,該怎麼辦? – PaulMcKenzie

1

我不認爲你應該從at()開始,因爲我們確信我們的程序沒有邊界訪問問題。因此我們立即開始使用[ ]。然而,如果我們通過SO上的帖子(由通常新的程序員)來訪問,關於向量訪問的許多問題可以很容易地解決,如果at()被用來檢測邊界問題。

鑑於此經驗,如果懷疑出現界限,或者有暗示可能會出界,請使用at()進行調試。

+2

_「因爲我們確信我們的程序沒有邊界訪問問題」_我們是? –

+2

我寫了一些諷刺,但好的程序員確實有這種信心。 – PaulMcKenzie

+0

我有信心,我沒有那種信心。 –

相關問題