微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

C++23 中 std::string::contains 的时间复杂度是多少?

如何解决C++23 中 std::string::contains 的时间复杂度是多少?

cppreference 说 std::string::contains 出来了, https://en.cppreference.com/w/cpp/string/basic_string/contains

但没有运行时要求。是否保证在线性时间内运行? (比如,在实现中使用 KMP 算法)还是二次时间?

我试图在当前的 C++ 标准草案 (http://open-std.org/jtc1/sc22/wg21/docs/papers/2020/n4849.pdf) 中找到它,但找不到参考。

解决方法

经过the most recent draftcontains 是:

相当于:

return basic_string_view<charT,traits>(data(),size()).contains(x);

使用 string_view function being

相当于:return find(x) != npos;

由于使用 basic_string_view::npos 对整数进行相等测试是一个常数时间操作,因此时间复杂度 will be that of basic_string_view::find

本小节中的成员函数在最坏情况下的复杂度为 O(size() * str.size()),尽管实现应该做得更好。

,

proposal (P1679) 表示 contains 等价于 find(x) != npos

最坏的情况下,复杂度可能是 O(size() * str.size())。由于 std::string::containsstd::string_view::contains 都是 constexpr 方法,如果两个字符串都是已知的,则该操作最多可以在编译时执行。

请注意,目前 (GCC 11) 在 libstdc++ 中只有 std::string_view 具有 constexpr 功能。

简单的 constexpr 示例:https://godbolt.org/z/Ejosx43bM

为 GCC 11 添加 contains() 到 libstdc++ 的提交:https://gcc.gnu.org/git/?p=gcc.git;a=commitdiff;h=f004d6d9fab9fe732b94f0e7d254700795a37f30

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。