我想通過做一些舊的Google Code Jam問題來練習C++。我找到的一個比較簡單的方法是將字串中的單詞反轉。它可以在這裏https://code.google.com/codejam/contest/351101/dashboard#s=p1如何優化這個C++?
發現到目前爲止,我有:
#include<iostream>
using namespace std;
int main(){
int n = 0;
cin >> n;
string rev = "";
string buf = "";
string data = "";
getline(cin, data);
for(int _ = 0; _ < n; _++){
getline(cin, data);
rev = "";
buf = "";
for(char& c : data) {
buf += c;
if(c == ' '){
rev = buf + rev;
buf = "";
}
}
cout << "Case #" << _ + 1 << ": " << buf << " " << rev << endl;
}
return 0;
}
這似乎是相當快速運行。當運行time ./reverse <in> /dev/null
且測試文件大約爲1.2E6
時,使用g++ -O3
進行編譯時,大約需要3.5
秒。
所以作爲基準我創建了蟒蛇
#!/usr/bin/env python
from sys import stdin, stdout
stdout.writelines(map(lambda n: "Case #%d: %s\n" % (n + 1, ' '.join(stdin.readline().split()[::-1])), xrange(int(stdin.readline()))))
的解決方案。然而,當我與time pypy reverse.py <in> /dev/null
運行pypy
下它只需約1.95
秒。
從理論上講,pypy
是用C++編寫的,不應該C++的速度要快或者更快,如果是的話,這個代碼怎麼會被優化得更快?
你真的不應該使用「_」作爲變量名,如果沒有別的只是作爲樣式的東西,但用_或__開始變量通常對某些編譯器有特殊意義。 – PherricOxide
@PherricOxide以下劃線開頭的標識符後面跟一個大寫字母,標識符包含雙下劃線保留給實現。這適用於_all_編譯器。 –
謝謝你告訴我。我認爲我最初使用它是因爲我不認爲我需要它,我想這只是一個從python編碼的習慣,如果有一個變量,你不需要在for循環中,我發現大多數只是稱之爲「_」 」。無論如何改變它似乎沒有太大的時間差異。 – luke