Вам потребуется чуть больше, чем одна переменная line
: ваш код не завершится, если строка содержит непробельный символ. Конечно, это предполагает, что он компилируется в первую очередь, так как отсутствуют круглые скобки и точка с запятой (также, ваш вопрос не соответствует вашему коду: нет функции substring
; если вы хотите эффективно программировать, Вы должны быть очень точными в отношении всего : компьютер воспринимает ваши утверждения очень буквально). Вы, вероятно, хотите нарезать ваш line
на куски и поместить их в какой-нибудь контейнер.
Как только вы пройдете этот тривиальный аспект, вы можете рассмотреть возможность использования ' '
вместо " "
, потому что в этом случае компилятор и библиотека могут предположить, что вы хотите искать только один символ, а не последовательность символов. Это может быть немного быстрее. Однако на самом деле это не пробел , а просто пробел. Пробельные символы также включают в себя ряд специальных символов, таких как '\t'
(табуляция), '\r'
(возврат каретки), '\n'
(перевод строки), '\v'
(вертикальная табуляция), '\b'
(возврат) и '\f'
(подача формы). Говоря о скорости, вы, вероятно, не хотите erase()
бит от начала строки, так как это приводит к алгоритму O (n * n), в то время как это можно сделать O (n), например. сохраняя переменную с позицией. Это также позволяет избежать проблемы поиска в два раза, что является ненужным дорогостоящим. Вы также должны учитывать поведение, если есть две соседние строки: должно ли это привести к появлению пустой строки в вашей последовательности, или это должно быть обработано, как если бы был один пробел (в этом случае вы могли бы также использовать first_not_of()
).
На самом деле, я просто перечитал формулировку проблемы: если вы просто хотите извлечь строку до первого пробела, вам не нужны erase()
, empty()
или цикл, если вы настаиваете на использовании assign()
, Однако это можно сделать, используя даже два члена std::string
: find()
и erase()
:
line.erase(line.find(" \t\r\n\v\b\f"));