访问矢量对象的最佳方式

时间:2015-06-20 12:10:55

标签: c++ vector iterator

如果我有矢量,

std::vector<int> MyVector;

想要访问该向量的第n个元素,我可以通过多种方式实现:

int x = MyVector[n];

int x = MyVector.at(n);

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

我确信还有更多方法可以访问向量中的对象。我要问的是,每个人的专业和缺点是什么,因此哪种方法最好?&#34;如果有的话。

此外,还有其中任何一种安全的benifets吗?如果没有,为什么有人会使用.at(x)而不是[x]?

5 个答案:

答案 0 :(得分:2)

如果你想访问第n个元素,因为std :: vector是零索引的,它应该如下:

int x = MyVector[n-1];

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

如果您使用std::vector:at(),它将检查边界条件并在您尝试访问范围之外的元素时抛出out_of_range异常。但是在访问vector元素的所有其他机制中,如果您尝试使用超出范围的索引,则会得到未定义的行为。

另一个标准模板库机制是std::vector::iterator来访问vector的元素。 std::vector<>提供随机访问迭代器。每当您使用标准算法时,迭代器都会很有用,因为它们大多数时候都希望iterators作为参数。

答案 1 :(得分:1)

这实际上取决于你想要访问第n个元素的原因(例如,改变它,将它与某些东西进行比较,在它之前或之后插入一些东西)和n的值的模式。你没有描述任何这些问题,所以唯一真正的答案是“它取决于”。对于所有情况都没有“最佳” - 如果有,那么矢量规范可能只提供这种访问方式。

每种访问方法都有不同的优点和缺点,具体取决于访问模式和原因。

例如,不同的技术适合重复访问向量的一个元素而不是顺序访问每个元素而不是以随机顺序访问某些元素集而不是访问每个第二个值,而n总是有效的索引,而n有时是索引无效(因此需要检查值)。

答案 2 :(得分:0)

std :: vector模拟动态分配的数组。因此,访问向量元素的最常用方法是使用下标运算符。

答案 3 :(得分:0)

迭代器对于向量并不是很有用,因为你可以使用[]或at进行随机访问,两者都以相同的方式工作,它们之间的唯一区别(正如我在参考文献中所读到的那样)是抛出一个向量如果你超出范围,超出范围的例外,而[]不是(我想这也可能会有点慢)

答案 4 :(得分:0)

tl; dr 回答:

  

每个[?]

的专业和缺点是什么?
  • []没有进行边界检查,即未使用稍快
  • at进行边界检查,即更安全稍慢

良好的经验法则:如果性能不是问题,请使用at,否则,请使用[]