Я пытаюсь практиковать C++, выполняя некоторые старые проблемы с Google Code Jam. Относительно простой я нашел, чтобы обратить слова в строку. Его можно найти здесь 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
случаев он занимает около 3.5
секунд при компиляции с g++ -O3
.
Так как эталон я создал решение в питона
#!/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
@PherricOxide Идентификаторы, начинающиеся с символа подчеркивания, за которым следует буква верхнего регистра, и идентификаторы, содержащие двойные подчеркивания, зарезервированы для реализации. Это относится к _all_ компиляторам. –
Спасибо, что рассказала мне. Я думаю, что я использовал его изначально, потому что я не думал, что мне это нужно, и я думаю, что это просто привычка от кодирования в python, где, если есть переменная, которая вам не нужна в цикле for, которую я нашел, просто назовите ее «_ ». Во всяком случае, изменение его, похоже, не имеет большого значения для времени. – luke