C++11 迭代中的差异

C++11 迭代中的差异,c++11,dictionary,vector,iteration,C++11,Dictionary,Vector,Iteration,我试图解决问题D,因为阅读任务并不是很重要,我注意到这两个代码在执行时略有不同: map < string, vector <string> > G; // Version 1 bool dfs(string s, string t) { if( s == t ) return true; for(int i = 0; i < int(G[s].size()); i++) { if( dfs( G[s][i], t ) ) ret

我试图解决问题D,因为阅读任务并不是很重要,我注意到这两个代码在执行时略有不同:

map < string, vector <string> > G;

// Version 1
bool dfs(string s, string t) {
    if( s == t ) return true;

    for(int i = 0; i < int(G[s].size()); i++) {
        if( dfs( G[s][i], t ) ) return true;
    }
    return false;
}
// Version 2
bool dfs(string s, string t) {
    if( s == t ) return true;

    for(auto r: G[s]) {
        if( dfs( r, t ) ) return true;
    }
    return false;
}

特别是第1版在评估中获得TLE,而第2版没有任何问题通过。奇怪的是,版本1速度较慢,在我的PC上用最大的测试用例测试时,我得到了相同的执行时间。。。您能帮助我吗?

在版本一中,for循环中有intG[s].size,它为循环的每次迭代调用变量的size函数。尝试在for循环之前创建一个变量,该变量对size函数求值一次,并将其用于循环中的比较。这将比您当前拥有的版本1更快。

版本1每次迭代执行两次查找G[s]。第二版只做一次,总共。谢谢!我试过你的建议,它被接受了,但是它仍然比版本2慢0.2秒。是的,版本2在数组上迭代,而不是索引到数组中,据我回忆,在某些情况下稍微快一点。但至少你知道为什么版本1失败了。