访问矢量对象的最佳方式
Best way to access vector objects
如果我有一个向量,
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 会抛出一个超出范围的异常,如果你越界,而 [] 不是(我想这也可能使速度慢一点)
- 在c代码之间共享数据的最佳方式
- 使用QQuickFramebufferObject时同步数据的最佳方式是什么
- 从嵌套在std::映射中的std::列表中删除元素的最佳方式
- 如果条件为TRUE(最佳方式?),则在do while循环中后置增量
- 在reactor中存储eventHandlers的最佳方式是什么
- 在AVX通道中混洗的最佳方式
- 从 T 创建 std::future 的最佳方式<T>
- C++:使用 std::unique_ptr 访问重载运算符++的最佳方式?
- 对列表列表中的元素进行分组的最佳方式
- 利用 GPU 的最佳方式
- 使用 QT C++过滤大数据的最佳方式
- 算法设计:用边界数字表示 2D 网格的最佳方式,以C++?
- 在C++中共享键值对的最佳方式
- 为Catch2中的外部文本文件指定路径的最佳方式
- 代表Quarto棋盘游戏棋子的最佳方式
- 等待线程的最佳方式是什么
- 将uint8_t*buffer和size_tbufferlen从C++传递到C中的API函数的最佳方式是什么
- 创建控制台菜单C++的最佳方式
- 只显示片段着色器的最佳方式是什么
- 复制文件的最佳方式是什么,以便我可以在复制过程中轻松取消复制?