2013-07-01 3 views
0

Мне нужно прочитать огромные строки строк от stdin, поэтому время является критическим вопросом. Строки находятся на последовательных линиях и не имеют пробелов, поэтому я могу просто использовать while(cin>>str) { //code }, но это очень медленно. Я слышал, что scanf намного быстрее, чем cin, но если я использую scanf("%s,str), я думаю, что str обрабатывается как char*, а не C++ string, поэтому я не могу использовать STL. Я мог бы принимать ввод как char * и копировать все символы в строку C++, но IMO, которая также будет медленной.Самый быстрый способ ввода огромных строк?

Есть ли способ получить ввод с помощью scanf или что-то еще, но в результате получить строку C++?

+1

Профиль обоим, а затем решить. –

+0

Строки STL имеют конструктор для генерации из строк C. –

+0

не является сканированием, абсолютно занесенным в черный список как переполнение буфера verfire? –

ответ

1

Если вы знаете средний или максимальный размер текста, вы создаете std::string с предварительно выделенным размером. Одной из областей, занимающих много времени, является выделение памяти (пере) на std::string.

+0

как я могу это сделать? Я знаю, что максимальный размер составляет 200000 символов, но я не хочу заполнять строку при инициализации. Должен ли я использовать string :: resize? (И если после этого я удалю строку и захочу ее повторно использовать, я должен снова изменить размер или сохранить размер памяти. Я использую строку :: clear, чтобы удалить ее.) – ofey

+0

Думаю, я понял. 'string :: reserve'. но, как я спросил, после того, как я удаляю строку с помощью 'string :: clear' и хочу ее повторно использовать, должен ли я снова набирать 'string :: reserve'? – ofey

0

cin >> str - это самое близкое, что вы найдете в STL до scanf("%s, str"). Единственная причина, по которой scanf будет быстрее, чем, заключается в том, что вместо строки вы должны указать char*, и хотя вы можете создать новую строку из char*, просто передав их в конструктор string(), это будет почти то же самое предмет как используя cin >> str.

0

Вы можете использовать getline:

for (std::string line; getline(std::cin, line);) { 
    do_something_with(line); 
} 

Я не знаю, если это быстрее, чем cin >> line, но это может быть, так как не нужно иметь дело с пробелами, кроме символов новой строки. Но я не думаю, что это так же важно, как накладные расходы на часовое строительство.

Смежные вопросы