C++ 查找操作的时间复杂性

C++ 查找操作的时间复杂性,c++,stl,C++,Stl,可能重复: STL中字符串库内置的查找操作的时间复杂度是多少?最多执行的比较与范围[first,last]中的元素数相同 本标准第21.4.7.2节未对复杂性做出任何保证 不过,您可以合理地假设搜索字符串的长度需要线性时间,因为即使是幼稚的算法(检查每个子字符串是否相等)也有这种复杂性,而且std::string构造函数不太可能构建一个奇特的索引结构来实现比这更快的任何功能 根据实现的不同,搜索模式的复杂性可能在线性和常量之间合理变化。正如评论中指出的,标准并没有规定这一点 但是,由于std:

可能重复:


STL中字符串库内置的查找操作的时间复杂度是多少?

最多执行的比较与范围[first,last]中的元素数相同


本标准第21.4.7.2节未对复杂性做出任何保证

不过,您可以合理地假设搜索字符串的长度需要线性时间,因为即使是幼稚的算法(检查每个子字符串是否相等)也有这种复杂性,而且
std::string
构造函数不太可能构建一个奇特的索引结构来实现比这更快的任何功能


根据实现的不同,搜索模式的复杂性可能在线性和常量之间合理变化。

正如评论中指出的,标准并没有规定这一点


但是,由于
std::string
是一个通用的容器,它不能对它所持有的字符串的性质做出任何假设,因此可以合理地假设复杂性为
O(n)
以防你搜索单个
字符时,如果你想查找它的话,

N3485§21.4.7.2。@chris:所有这些告诉你的是,该标准没有规定任何复杂性要求。我没有得到你的参考。我的意思是,它引用了一些文档吗?我在谷歌上搜索了它,但它只让我回到了这个问题。@MikeSeymour,t这就是重点。当标准没有给出复杂度值时,你不能接受函数的复杂度值。可能的dup:再一次,这是关于
std::string::find
。但是如果我想匹配子字符串,它还会是线性的吗?它会是线性的,但不是
O(n)
,而是
O(n*m)
其中
m
是要匹配的子字符串的长度,因此我可以使用str.find,而不是说实现KMP算法来搜索子字符串?您的实现可能也使用KMP。首先检查它。如果没有,而且性能很关键,那么一定要注意Boost有一个Boyer Moore,小子er Moore Horspool和Knuth Morris Pratt搜索算法可供您使用。请参阅