【发布时间】:2015-08-19 17:42:52
【问题描述】:
我提出这个问题是因为我将我的标记器从 strtok_r 移到了 C++ 中的等效版本。我必须使用 strtok_r 代替 strtok,因为我有 2 个嵌套标记化来执行大部分时间。
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 版本? 对于长字符串,使用 C++ 版本我必须等待大约 10 秒,而 C 版本使用相同的字符串是瞬时的。 因此,似乎 C++ 版本具有更高的复杂性...... 你怎么看?
【问题讨论】:
-
strtok修改输入字符串,而 C++ 版本正在复制。虽然他们可能有相同的最终结果,但两个版本正在采取截然不同的路线到达终点。 -
您可能希望了解如何拆分字符串 C++,因为它更有效:stackoverflow.com/questions/236129/split-a-string-in-c您的数据是什么样的,您想用它做什么?
-
如果您在常量字符串上进行测试,具有等效 _builtin 的函数将始终获胜,因为它被折叠了。
-
可能是因为 C 库是在资源稀缺且效率优于简洁设计的时代编写的,而 C++ 更关注健壮性和设计 - 但这只是我的看法 :-)