【问题标题】:String search algorithm used by string::find() c++string::find() c++ 使用的字符串搜索算法
【发布时间】:2010-04-02 23:10:54
【问题描述】:

它如何比 cstring 函数快?是否有类似的源代码可用于 C?

【问题讨论】:

  • 为什么你认为它更快?
  • 你能发布你用来计时相对速度的代码吗?您实际上可能在测试框架中看到了差异,而不是在底层代码中。
  • 如果不讨论 C 和 C++ 库(分别)以及 C++ 和 C 编译器(分别)的实现,就无法讨论速度。 C89、C99、C++0x 等是定义语言应该如何实现的标准。当人们谈论“C”或“C++”时,他指的是一般的语言,而不是具体的实现。由于没有参考您的平台,我们甚至无法开始回答您的问题?
  • 对于任何 STL 实现,它都不会是 Rabin-Karp、Knuth-Morris-Pratt 或 Boyer-Moore - 如果这就是您想要找出的。

标签: c++ c


【解决方案1】:

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

不过,一般来说,大多数 STL 函数并不比 C 对应的函数快。与狭义的 C 等效项相比,它们通常更安全、更通用,并且旨在适应更广泛的环境。

【讨论】:

  • 任何采用函子的 STL 函数通常都比采用函数指针的 C 更快。例如,std::sortstd::binary_search 比 C 标准库中包含的 qsortbsearch 快​​得多。
  • 没有“封闭源二进制”版本的 STL。没有人实现过可导出的模板,每个人都必须为他们的 STL 实现提供源代码。包括 Dinkumware。
  • 很高兴知道。我已经相应地编辑了答案,谢谢。不过,Comeau C++ 没有可导出的模板吗?我认为它是唯一真正实现它的编译器。
  • 是的,EDG 已经实现了对导出模板的支持。当然,该功能在 C++0x 中被删除(不仅仅是弃用),所以如果你要使用export,快点,你还有大约一年的时间。 ;)
  • 我听说了。我认为这是一种耻辱——该功能是一个很好的功能——但我理解他们为什么要这样做,因为没有人愿意实际构建它。
【解决方案2】:

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

或者复制一个字符串,实际复制没有任何好处,但要弄清楚在复制之前要分配多少内存是 O(1)。整体算法仍然是O(n)。基本操作还是一样的,在任何语言中铲取字节的时间都一样。

String 类很有用,因为它们更安全(更难击中你的脚)并且更易于使用(需要较少显式的代码)。它们变得流行并被广泛使用,因为它们并不慢。

【讨论】:

    【解决方案3】:

    几乎可以肯定,字符串类存储的有关字符串的数据比您在 C 字符串中找到的要多得多。长度就是一个很好的例子。作为额外内存使用的权衡,您将获得一些空闲的 CPU 周期。

    编辑: 但是,一个比另一个慢得多的可能性不大,因为它们将执行基本相同的操作。 MSDN 建议 string::find() 不使用基于函子的系统,因此他们不会进行优化。

    【讨论】:

      【解决方案4】:

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

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

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

      【讨论】:

        猜你喜欢
        • 2019-11-26
        • 2012-01-24
        • 1970-01-01
        • 2018-12-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-06-08
        相关资源
        最近更新 更多