【发布时间】:2013-07-02 21:16:12
【问题描述】:
我正在尝试通过解决一些旧的 Google Code Jam 问题来练习 C++。我发现一个相对简单的方法是反转字符串中的单词。可以在这里找到https://code.google.com/codejam/contest/351101/dashboard#s=p1
到目前为止,我有:
#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;
}
这似乎运行得很快。当使用大约1.2E6 的测试文件运行time ./reverse < in > /dev/null 时,使用g++ -O3 编译需要大约3.5 秒。
所以作为基准,我在 python 中创建了一个解决方案
#!/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()))))
但是,当我在 pypy 和 time pypy reverse.py < in > /dev/null 下运行它时,它只需要大约 1.95 秒。
理论上pypy 是用 C++ 编写的,C++ 不应该同样快或更快,如果是这样,如何优化此代码以更快?
【问题讨论】:
-
你真的不应该使用“_”作为变量名,如果没有别的只是作为一种风格的东西,但以 _ 或 __ 开头的变量对于某些编译器通常具有特殊含义。
-
@PherricOxide 标识符以下划线开头,后跟大写字母,包含双下划线的标识符保留用于实现。这适用于所有编译器。
-
谢谢你告诉我。我想我最初使用它是因为我认为我不需要它,我想这只是 python 编码的一种习惯,如果在 for 循环中有一个你不需要的变量,我发现大多数人都称之为“_ ”。无论如何改变它似乎对时间没有太大影响。
-
如果你想要真的良好的性能,放弃 C++ io 的东西和字符串...
-
普通老 C、char*、malloc...
标签: c++ optimization g++ pypy