c++ - 通过迭代器与通过运算符 []/索引访问 std::vector 的速度?

标签 c++ stl vector iterator performance

说,我有一个

std::vector<SomeClass *> v;

在我的代码中,我需要在程序中经常访问它的元素,将它们向前和向后循环。

这两种访问类型中哪一种是最快的?

迭代器访问:

std::vector<SomeClass *> v;
std::vector<SomeClass *>::iterator i;
std::vector<SomeClass *>::reverse_iterator j;

// i loops forward, j loops backward
for( i = v.begin(), j = v.rbegin(); i != v.end() && j != v.rend(); i++, j++ ){
    // some operations on v items
}

下标访问(按索引)

std::vector<SomeClass *> v;
unsigned int i, j, size = v.size();

// i loops forward, j loops backward
for( i = 0, j = size - 1; i < size && j >= 0; i++, j-- ){
    // some operations on v items
}

而且,如果我不必修改 vector 元素,const_iterator 是否提供了一种更快的访问 vector 元素的方法?

最佳答案

性能差异可能可以忽略不计或没有(编译器可能会将它们优化为相同);您应该担心其他事情,例如您的程序是否正确(缓慢但正确的程序比快速且不正确的程序要好)。不过,使用迭代器还有其他优点,例如能够在不修改循环的情况下将底层容器更改为没有 operator[] 的容器。见 this question了解更多。

与普通迭代器相比,const_iterators 很可能没有或可以忽略的性能差异。它们旨在通过防止修改不应修改的内容来提高程序的正确性,而不是为了性能。 const 关键字也是如此。

简而言之,在发生以下两件事之前,您不应该担心优化:1) 您注意到它运行太慢和 2) 您已经分析了瓶颈。对于 1),如果它的运行速度比它可以运行的慢十倍,但只运行一次并且需要 0.1 毫秒,谁在乎呢?对于 2),确保它绝对是瓶颈,否则优化它对性能几乎没有可衡量的影响!

关于c++ - 通过迭代器与通过运算符 []/索引访问 std::vector 的速度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2524233/

相关文章:

带指针的 C++ STL 容器 : A few questions

c++ - 当整数变量用于在 C++ 中声明数组大小时,错误显示为 "Expression must have a const value"

c++ - 创建一个 char 数组,其大小由参数给出 - C++

c++ - 返回 C++ const 项,取决于是否存在,安全

c++ - C++ 中的同步 unordered_map

c++ - 将元素添加到未存储的 c++ 类中的 vector

c++ - 调试错误 - vector 下标超出范围 - PCL

r - 带小数的 for 循环并将结果存储在向量中

c++ - 在 omnet++ IDE 中找不到 -lC :\SQLAPI\lib\sqlapi. 库

c++ - 在 C++ 的类中使用管道