В большинстве случаев копирование представляет собой очень небольшой процент от общих затрат, поэтому использование более чистого и высоко читаемого кода становится более важным. В редких случаях, когда профилировщик времени сообщает вам, что копирование создает узкое место, вы можете перебирать символы в строке с некоторой помощью из стандартной библиотеки.
Один подход, который вы могли бы сделать, это итерацию с std::string::find_first_of
и std::string::find_first_not_of
функций-членов, как это:
const std::string s = "quick \t\t brown \t fox jumps over the\nlazy dog";
const std::string ws = " \t\r\n";
std::size_t pos = 0;
while (pos != s.size()) {
std::size_t from = s.find_first_not_of(ws, pos);
if (from == std::string::npos) {
break;
}
std::size_t to = s.find_first_of(ws, from+1);
if (to == std::string::npos) {
to = s.size();
}
// If you want an individual word, copy it with substr.
// The code below simply prints it character-by-character:
std::cout << "'";
for (std::size_t i = from ; i != to ; i++) {
std::cout << s[i];
}
std::cout << "'" << std::endl;
pos = to;
}
Demo.
К сожалению, код становится намного труднее читать, поэтому следует избегать это изменение или, по крайней мере, отложить его до тех пор, пока оно не будет восстановлено.
Нет такой вещи, как «наиболее эффективный способ» – Slava
Вам нужно заполнить всю строку? Если нет, вы можете просто прочитать его в виде слов с самого начала. – NathanOliver
Что случилось с «ручным повторением каждого символа»? Это то, что 'istringstream :: operator >>' вероятно все равно (поверх копирования результата в аргумент 'word'). –