我想通过做一些旧的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