【问题标题】:What's the time complexity of std::string::contains in C++23?C++23 中 std::string::contains 的时间复杂度是多少?
【发布时间】:2021-06-17 11:09:42
【问题描述】:

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) 中找到它,但找不到参考。

【问题讨论】:

    标签: c++ c++23


    【解决方案1】:

    经过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()),尽管实现应该做得更好。

    【讨论】:

      【解决方案2】:

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

      在最坏的情况下,复杂度可能是 O(size() * str.size())。如果 std::string::containsstd::string_view::contains 都是 constexpr 方法,那么最好在编译时执行该操作。

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

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

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

      【讨论】:

        猜你喜欢
        • 2020-07-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-07-31
        • 2021-02-10
        • 2020-10-13
        • 2014-11-29
        • 1970-01-01
        相关资源
        最近更新 更多