访问矢量对象的最佳方式

Best way to access vector objects

本文关键字:最佳 方式 对象 访问      更新时间:2023-10-16

如果我有一个向量,

std::vector<int> MyVector;

并且想要访问该向量的第 n 个元素,我可以通过许多不同的方式做到这一点:

int x = MyVector[n];

int x = MyVector.at(n);

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

我相信还有更多方法可以访问向量中的对象。我要问的是,每种方法的优缺点是什么,因此哪种方法将是"最好的"(如果有的话)。

另外,这些有没有安全的好处?如果不是,为什么有人会使用 .at(x) 而不是 [x]?

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

int x = MyVector[n-1];

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

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

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

dr 回答:

每种方法的优缺点是什么[?

  • []不进行边界检查,即它不安全速度稍快
  • at进行边界检查,即它更安全速度稍慢

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

这实际上取决于您为什么要访问第 n 个元素(例如,更改它,将其与某些内容进行比较,在它之前或之后插入某些内容)以及 n 的值模式。 你没有描述任何这些问题,所以唯一真正的答案是"视情况而定"。 没有适用于所有情况的"最佳"——如果有,那么矢量规范可能只会提供这种访问方式。

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

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

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

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