string :: find()c ++使用的字符串搜索算法

时间:2010-04-02 23:10:54

标签: c++ c

它比cstring函数更快?是否可用于C?

4 个答案:

答案 0 :(得分:3)

没有C ++标准库的标准实现,但您应该能够查看编译器附带的实现,并了解它是如何工作的。

一般来说,大多数STL功能并不比它们的C语言快。它们通常更安全,更通用,旨在适应范围更广的环境,而不是狭隘的C等价物。

答案 1 :(得分:1)

任何字符串类的标准优化都是将字符串长度与字符串一起存储。这将使任何需要字符串长度的字符串操作为O(1)而不是O(n),strlen()是显而易见的。

或者复制字符串,实际副本中没有任何增益,但要确定在复制为O(1)之前要分配多少内存。整个算法仍然是O(n)。基本操作仍然是相同的,铲除字节的时间与任何语言一样长。

字符串类很有用,因为它们更安全(更难射击)并且更容易使用(需要更少的显式代码)。它们变得流行并被广泛使用,因为它们并不慢。

答案 2 :(得分:0)

字符串类几乎肯定会存储有关字符串的更多数据,而不是在C字符串中找到的数据。长度就是一个很好的例子。在额外内存使用的权衡中,您将获得一些备用CPU周期。

编辑: 然而,它不可能比另一个慢得多,因为它们将从根本上执行相同的动作。 MSDN建议string :: find()不使用基于仿函数的系统,因此它们不会进行优化。

答案 3 :(得分:0)

如何实现查找字符串技术有很多可能性。最简单的方法是检查目标字符串的每个位置(如果有搜索字符串)。您可以非常快速地编码,但它的可能性最慢。 (O(m * n),m =长度搜索字符串,n =长度目标字符串)

查看维基百科页面http://en.wikipedia.org/wiki/String_searching_algorithm,提供了不同的选项。 最快的方法是创建一个有限状态机,然后你可以插入字符串而不会向后移动。那就是O(n)。

STL实际使用哪种算法,我不知道。但您可以搜索源代码并将其与算法进行比较。