用 vector::iterator 或 at() 迭代 STL 向量有什么更快的方法?

新手上路,请多包涵

在性能方面,什么会更快?有区别吗?它依赖于平台吗?

 //1. Using vector<string>::iterator:
vector<string> vs = GetVector();

for(vector<string>::iterator it = vs.begin(); it != vs.end(); ++it)
{
   *it = "Am I faster?";
}

//2. Using size_t index:
for(size_t i = 0; i < vs.size(); ++i)
{
   //One option:
   vs.at(i) = "Am I faster?";
   //Another option:
   vs[i] = "Am I faster?";
}

原文由 Gal Goldman 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 816
2 个回答

为什么不写一个测试并找出答案?

编辑: 我的错 - 我以为我正在计时优化版本,但不是。在我的机器上,使用 g++ -O2 编译,迭代器版本比 operator[] 版本 稍慢,但可能并不明显。

 #include <vector>
#include <iostream>
#include <ctime>
using namespace std;

int main() {
    const int BIG = 20000000;
    vector <int> v;
    for ( int i = 0; i < BIG; i++ ) {
        v.push_back( i );
    }

    int now = time(0);
    cout << "start" << endl;
    int n = 0;
    for(vector<int>::iterator it = v.begin(); it != v.end(); ++it) {
        n += *it;
    }

    cout << time(0) - now << endl;
    now = time(0);
    for(size_t i = 0; i < v.size(); ++i) {
        n += v[i];
    }
    cout << time(0) - now << endl;

    return n != 0;
}

原文由 anon 发布,翻译遵循 CC BY-SA 3.0 许可协议

仅与原始问题略微相切,但最快的循环将是

for( size_t i=size() ; i-- ; ) { ... }

这当然会倒计时。如果您的循环中有大量迭代,这确实可以节省大量资金,但它只包含少量非常快速的操作。

因此,使用 [] 运算符访问,这可能比已经发布的许多示例更快。

原文由 jam spandex 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题