Разбор строки в пробеле с помощью методов assign, substring и find - PullRequest
0 голосов
/ 25 февраля 2012

Я хотел бы проанализировать строку, используя пробелы в качестве разделителей.Я знаю, что это можно сделать, используя 3 метода из библиотеки строк: assign, substring и find.По сути, я хочу назначить моей целевой строке подстроку от начала строки до первого вхождения пробела.

Было бы что-то вроде этого

while(!line.empty())
{

    line.assign(line.substr(0, line.find(" ")
    line.erase(0, line.find(" ");

}

Мой вопрос, будет ли этобыть хорошим способом разобрать строку?

1 Ответ

2 голосов
/ 25 февраля 2012

Вам потребуется чуть больше, чем одна переменная 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"));
...