2015-06-20 121 views
0

如果我有一個載體,最佳方式對象

std::vector<int> MyVector; 

而且要訪問矢量的第n個元素,我可以在許多不同的方式做到這一點:

int x = MyVector[n]; 

int x = MyVector.at(n); 

甚至使用我不熟悉的迭代器。

我相信還有很多方法可以訪問矢量中的對象。我所問的是,每個人的贊成和反對是什麼,因此哪種方法是最好的。

此外,有任何這些safeif benifets?如果不是爲什麼任何人會在[x]上使用.at(x)?

+0

@MrLister,我不太確定他們是否會被優化掉,因爲'at()'廣告邊界檢查,而'operator []'沒有。從使用'at()'的代碼中刪除邊界檢查將是一個潛在的突破性優化。儘管看看這個組件,但這真是太棒了! – Alejandro

回答

0

TL;博士答案:

什麼是親的和每個

  • []不做邊界檢查的,也就是說,它是unsafer的利弊[?]稍快
  • at進行邊界檢查,即它是更安全稍慢

好經驗法則:如果性能不是問題,請使用at,否則使用[]

+1

謝謝。清晰簡潔 –

0

std :: vector模擬動態分配的數組。因此,訪問矢量元素的最常用方式是使用下標運算符。

0

迭代器對矢量並不是很有用,因爲你可以用[]或at進行隨機訪問,兩者都以相同的方式工作,它們之間的唯一區別(就像我在引用中讀到的那樣)是拋出一個超出範圍的例外,如果你超出界限,而[]不(我想這也可能會使速度慢一點)

1

這真的取決於你爲什麼要訪問第n個元素(例如改變它,將它與某些東西進行比較,在它之前或之後插入一些東西)以及n值的模式。你沒有描述任何這些擔憂,所以唯一真正的答案是「這取決於」。在所有情況下都沒有「最好的」 - 如果有的話,那麼矢量規範可能只會提供這種訪問方式。

每種訪問方法都有不同的優點和缺點,具體取決於訪問模式和原因。例如,不同的技術適合於訪問一個向量的一個元素,而不是順序訪問每個元素,而不是以隨機順序訪問某些元素集,而不是訪問每個第二個值,而n始終是一個有效的索引,而不是n。一個無效索引(因此需要檢查該值是否需要)。

2

如果您要訪問第n個元素,因爲性病::矢量爲零索引應該如下:

int x = MyVector[n-1]; 

int x = MyVector.at(n-1); 

如果使用std::vector:at()它將檢查邊界條件並拋出out_of_range異常,如果您嘗試訪問一個元素超出範圍。但在所有其他機制來訪問向量元素,如果你嘗試使用了一系列指標,你會得到不確定的行爲。

另一個標準模板庫機制是std::vector::iterator訪問向量的元素。 std::vector<>提供隨機訪問迭代器。只要您使用標準算法,因爲他們預計iterators作爲其參數的大部分時間迭代器將是有益的。