Я задаю этот вопрос, потому что я переместил свой токенизатор из strtok_r в эквивалентную версию на C++. Я должен использовать strtok_r вместо strtok, потому что большую часть времени мне приходится выполнять две вложенные токенизации.
Алгоритм strtok_r примерно такой:
char *end_token, *token, *word ;
// fill 'word'
token = strtok_r (word, " ", &end_token) ;
while (token != NULL) {
// do something
token = strtok_r (NULL, " ", &end_token) ;
}
И версия C++ выглядит так (взято из другого поста здесь):
string mystring, token ;
size_t next_token ;
// fill 'mystring'
while (token != mystring) {
next_token = mystring.find_first_of (" ") ;
token = mystring.substr (0, next_token) ;
mystring = mystring.substr (next_token + 1) ;
// do something
}
Теперь вопрос: почему версия C++ так сильно относится к версии C? Для длинных строк мне приходится ждать около 10 секунд с версией C++, в то время как версия C выполняется мгновенно с теми же строками. Итак, похоже, что версия C++ имеет более высокую сложность... Что вы думаете об этом?
strtok
изменяет входную строку, в то время как версия C++ делает копии. Хотя у них может быть один и тот же конечный результат, две версии идут совершенно разными путями, чтобы достичь цели. - person Chad   schedule 19.08.2015