2012-06-23 49 views
29

如果我想獲得矢量值,我可以使用兩個選項:使用[]運算符。或者,我可能會使用.AT例如功能使用:爲什麼在C++中使用「vector.at(x)」比「vector [x]」更好?

vector<int> ivec; 
ivec.push_back(1); 

現在我可以做兩件事

int x1 = ivec[0]; 
int x2 = ivec.at(0); // or 

聽說用在一個更好的選擇,因爲當我使用該選項,我可以拋出這個一個例外。

有人能解釋一下嗎?

+3

「有什麼區別?」是一個很好的問題。答案是:1)自動範圍檢查(.at()會拋出一個超出範圍的異常,[]會自動失敗),以及2)個人偏好 - 你更喜歡哪種語法。 「哪個更好?」另一方面是價值判斷。答案是必要的「這取決於」。恕我直言... – paulsm4

+11

沒有人更好,他們服務於類似但不同的目的。 –

回答

54

c[i]c.at(i)之間的差別在於​​拋出std::out_of_range異常,如果i落在矢量的範圍之外,而operator[]只是調用未定義的行爲,這意味着什麼都可能發生。

沒有人說at()operator[]更好。這取決於具體情況。由於at()執行範圍檢查,因此可能並不總是如此,特別是當您的代碼本身確保索引永遠不會超出範圍時。在這種情況下,operator[]更好。

考慮以下循環:

for(size_t i = 0 ; i < v.size(); ++i) 
{ 
    //Should I use v[i] or v.at(i)? 
} 

在這樣的循環,operator[]總是相比at()成員函數的更好選擇。

我希望at()當我希望它拋出異常的情況下索引無效,以便我可以在catch{ ...}塊做替代工作。 例外幫助您從特殊/替代代碼正常代碼分開爲

try 
{ 
    size_t i = get_index(); //I'm not sure if it returns a valid index! 

    T item = v.at(i); //let it throw exception if i falls outside range 

    //normal flow of code 
    //... 
} 
catch(std::out_of_range const & e) 
{ 
    //alternative code 
} 

在這裏,你可以自己去查i,以確保它是有效的索引,然後調用operator[]代替at(),但它將使用if-else塊將正常代碼與替代代碼混合,這使得難以閱讀代碼的正常流程。如果您看到上面的內容,try-catch可以提高代碼的可讀性,因爲確實將與正常代碼分開,從而產生整潔乾淨的代碼。

+4

「沒有人說'()'更好」 - 哈!你會感到驚訝。 –

+0

@KonradRudolph:什麼? – Nawaz

+7

不要低估那裏有多少白癡,他們中有多少人教C++。 ;-) –

10

at[]之間的唯一區別在於at執行範圍檢查,而[]沒有。如果您已經檢查過範圍或者構建了索引以避免超出範圍,並且需要重複訪問某個項目,則可以通過選擇[]而不是at來節省幾個CPU週期。單個校驗和多個的

實施例訪問:

for (size_t i = 0 ; i != vect.size() ; i++) { 
    if (vect[i] > 42) { 
     // .... 
    } 
} 
0

其他的答案是完全正確的,但可能:當索引被構造成內部限制的情況下的

size_t index = get_index(vect); 
if (index < 0 || index >= vect.size()) return; 
if (vect[index] > 0) { 
    // .... 
} else if (vect[index] > 5) { 
    // .... 
} else .... 

實施例給出這樣的印象:在編寫代碼時仍然在調試中使用at()是個好主意,因爲這會導致錯誤信號。這種情況通常是這樣,但不適用於大多數廣泛使用的編譯器 - gcc可以設置爲執行(致命)範圍檢查putting it in debug mode,並且可能在Visual Studio中執行類似的操作。

0

矢量方法C++ .at因此當向量中不存在該元素時會檢查邊界,並拋出out_of_range異常。

當使用[]時,不會檢查邊界是否在矢量上執行檢查,因此如果該元素不存在,則不會引發異常,並且結果是未定義的行爲,如具有在矢量中沒有任何元素的隨機值。

從安全角度來看,使用[]要好於at但是這需要更多的時間並且會影響程序的性能。

相關問題