如果我想獲得矢量值,我可以使用兩個選項:使用[]運算符。或者,我可能會使用.AT例如功能使用:爲什麼在C++中使用「vector.at(x)」比「vector [x]」更好?
vector<int> ivec;
ivec.push_back(1);
現在我可以做兩件事
int x1 = ivec[0];
int x2 = ivec.at(0); // or
聽說用在一個更好的選擇,因爲當我使用該選項,我可以拋出這個一個例外。
有人能解釋一下嗎?
如果我想獲得矢量值,我可以使用兩個選項:使用[]運算符。或者,我可能會使用.AT例如功能使用:爲什麼在C++中使用「vector.at(x)」比「vector [x]」更好?
vector<int> ivec;
ivec.push_back(1);
現在我可以做兩件事
int x1 = ivec[0];
int x2 = ivec.at(0); // or
聽說用在一個更好的選擇,因爲當我使用該選項,我可以拋出這個一個例外。
有人能解釋一下嗎?
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
可以提高代碼的可讀性,因爲確實將與正常代碼分開,從而產生整潔乾淨的代碼。
at
和[]
之間的唯一區別在於at
執行範圍檢查,而[]
沒有。如果您已經檢查過範圍或者構建了索引以避免超出範圍,並且需要重複訪問某個項目,則可以通過選擇[]
而不是at
來節省幾個CPU週期。單個校驗和多個的
實施例訪問:
for (size_t i = 0 ; i != vect.size() ; i++) {
if (vect[i] > 42) {
// ....
}
}
其他的答案是完全正確的,但可能:當索引被構造成內部限制的情況下的
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中執行類似的操作。
矢量方法C++ .at
因此當向量中不存在該元素時會檢查邊界,並拋出out_of_range
異常。
當使用[]
時,不會檢查邊界是否在矢量上執行檢查,因此如果該元素不存在,則不會引發異常,並且結果是未定義的行爲,如具有在矢量中沒有任何元素的隨機值。
從安全角度來看,使用[]
要好於at
但是這需要更多的時間並且會影響程序的性能。
「有什麼區別?」是一個很好的問題。答案是:1)自動範圍檢查(.at()會拋出一個超出範圍的異常,[]會自動失敗),以及2)個人偏好 - 你更喜歡哪種語法。 「哪個更好?」另一方面是價值判斷。答案是必要的「這取決於」。恕我直言... – paulsm4
沒有人更好,他們服務於類似但不同的目的。 –