2015-06-20 114 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作为其参数的大部分时间迭代器将是有益的。