У меня есть большой файл, где каждая строка содержит целые числа, разделенные пробелами. Задача состоит в том, чтобы разрезать этот файл по очереди. Для строки для преобразования Int У меня есть три решения:преобразовать строку в int
static int stringToIntV1(const string& str) {
return (atoi(str.c_str()));
}
Однако, если я прохожу искаженной строки, он не производит каких-либо ошибок. Например строка «123error» преобразуется в 123.
Второе решение:
static int stringToIntV2(const string& str)
{
int result;
istringstream myStream(str);
if (myStream >> result) {
return result;
}
// else
throw domain_error(str + " is not an int!");
}
У меня такая же проблема здесь, деформированные строки не вызывают ошибку.
Третье решение с усилением (находится в Boost Library):
static int stringToIntV3(const string& str)
{
int iResult = 0;
try {
iResult = lexical_cast<int>(str);
}
catch(bad_lexical_cast &) {
throw domain_error(str + " is not an int!");
}
return iResult;
}
Это один дает правильный результат.
Однако существует значительная разница во времени выполнения. Тестирование на большой текстовый файл (32 Мб), я получил следующие времена:
- (1) с atoi: 4.522s (победитель)
- (2) с istringstream: 15.303s (очень медленно)
- (3) с lexical_cast: 10.958s (между два)
Моим вопросом: вы знаете, как заметить ТЗ сформированные струны с атой? Это даст самое быстрое решение. Или вы знаете лучшее решение?
Обновление: Спасибо за ответы. Следуя советам, я пришел с этим решением:
static int stringToIntV4(const string& str)
{
char * pEnd;
const char * c_str = str.c_str();
int result = strtol(c_str, &pEnd, 10);
if (pEnd == c_str+str.length()) {
return result;
}
// else
throw domain_error("'" + str + "'" + " is not an int!");
}
Хорошая новость заключается в том, что она дает, если есть проблема и столь же эффективным, как версия atoi
.
Посмотрите на strtol() в своем руководстве. – 2010-01-07 20:51:29
@Martin: Да, я использую 'g ++ -O3'. – Jabba
Вы включили оптимизатор? Кроме того, просмотр функции преобразования из контекста затрудняет определение правильности выполнения остальной части кода. V2 также должен дать ошибку (при следующей попытке прочитать), поэтому он предполагает, что вы выполняете другой синтаксический анализ, и это может быть причиной вашей медлительности. Также есть ли определенное требование для чтения строки за строкой или вы можете просто перевести целые числа в вектор? –