C ++迭代器比索引慢得多?

时间:2017-02-17 05:28:40

标签: c++

我有一个O(N^2)程序,我注意到使用迭代器和索引之间的巨大差异,我在这里粘贴代码和数据:

代码:

#include <string>
#include <cstdio>
#include <fstream>
#include <iostream> 
#include <sstream>
#include <vector>

using namespace std; 

int main(int argc, char* argv[]){
    ifstream ifile("csv.csv"); 
    string s; 

    vector<long> vec_frd;
    vector<long> vec_real_frd;

    while (getline(ifile, s)){
        string s2 = s.substr(0, s.find(','));
        vec_frd.push_back(stol(s.substr(0, s.find(',')))); 
    }    
    long real_frd;

    // using iterator 
    vector<long>::iterator it1, it2;
    for (it1=vec_frd.begin(); it1<vec_frd.end(); it1++){
        if (*it1 == -1){
            vec_real_frd.push_back(-1);
            continue; 
        }
        real_frd = *it1; 
        for (it2=it1; it2<it1+*it1 && it2<vec_frd.end(); it2++){
            if (*it2 == -1)
                real_frd --;
        }
        vec_real_frd.push_back(real_frd);
    }

    // using index 
    // for (unsigned int i=0; i<vec_frd.size(); i++){
    //     if (vec_frd[i] == -1){
    //         vec_real_frd.push_back(-1);
    //         continue; 
    //     }
    //     real_frd = vec_frd[i]; 
    //     for (unsigned int j=i; j<i+vec_frd[i] && j<vec_frd.size(); j++){
    //         if (vec_frd[j] == -1)
    //             real_frd --;
    //     }
    //     vec_real_frd.push_back(real_frd);
    // }        

    ifile.close();
    return 1; 
}

数据: https://www.dropbox.com/s/c2c7txhu24xy06r/csv.csv?dl=0

如果我们使用迭代器,在我的机器上它需要将近30秒,如果我们使用索引,它需要5秒,我是C ++的新手,这种性能差异是否正常?或者我错了?

1 个答案:

答案 0 :(得分:2)

回答你的问题 - 不,这种行为对于优化的代码来说绝对不正常 我无法用gcc或MSVC重现它。我认为最好的办法是仔细检查您的编译器选项。

另一方面,我相信你可以通过一些算法调整来加快这项任务的速度。即使渐近,我也很确定你可以通过预先计算几个计数器来从O(N^2)转到O(N)