Я мог бы посмотреть на std::stringstream
от <sstream>
. C-style strtok
имеет ряд проблем с юзабилити, а строки в C-стиле просто хлопотны.
Вот ультра-тривиальный пример того, как это предложение разбивается на слова:
#include <sstream>
#include <iostream>
#include <string>
int main(void)
{
std::stringstream sentence("This is a sentence with a bunch of words");
while (sentence)
{
std::string word;
sentence >> word;
std::cout << "Got token: " << word << std::endl;
}
}
janks@phoenix:/tmp$ g++ tokenize.cc && ./a.out
Got token: This
Got token: is
Got token: a
Got token: sentence
Got token: with
Got token: a
Got token: bunch
Got token: of
Got token: words
Got token:
Класс std::stringstream
является "двунаправленным" в том смысле, что он поддерживает ввод и вывод. Вы, вероятно, захотите сделать одно или другое, поэтому вы будете использовать std::istringstream
или std::ostringstream
.
Прелесть их в том, что они также std::istream
и std::ostream
s соответственно, поэтому вы можете использовать их так же, как и std::cin
или std::cout
, которые, надеюсь, вам знакомы.
Некоторые могут утверждать, что эти классы дороги в использовании; std::strstream
из <strstream>
- это в основном то же самое, но построено поверх более дешевых 0-концевых строк в стиле C. Это может быть быстрее для вас. Но в любом случае, я бы не стал беспокоиться о производительности сразу. Получите что-то работающее, а затем сравните его. Скорее всего, вы можете получить достаточную скорость, просто написав хорошо написанный C ++, который сводит к минимуму ненужное создание и уничтожение объектов. Если это все еще не достаточно быстро, то вы можете посмотреть в другом месте. Эти классы, вероятно, достаточно быстрые. Ваш процессор может тратить тысячи циклов на количество времени, которое требуется для чтения блока данных с жесткого диска или сети.