Какова временная сложность std :: string :: contains в C ++ 23?
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), но мне не удалось найти ссылку.
2 ответа
Исходя из самого последнего черновика ,
contains
является:
Эквивалентно:
return basic_string_view<charT, traits>(data(), size()).contains(x);
С <tcode id="25720055"></tcode>функция, являющаяся :
Эквивалентно:
return find(x) != npos;
Поскольку проверка на равенство целого числа с
basic_string_view::npos
является операцией с постоянным временем, временная сложность будет такой же, как у
<tcode id="25720058"></tcode>:
Функции-члены в этом подпункте в худшем случае имеют сложность O (size () * str.size()), хотя реализации должны работать лучше.
Предложение (P1679) указывает на то, что
contains
эквивалентно
find(x) != npos
.
В худшем случае сложность может быть O (size() * str.size()). В лучшем случае операция может быть выполнена во время компиляции, если известны обе строки, поскольку обе
std::string::contains
а также
std::string_view::contains
методы.
Обратите внимание, что в настоящее время (GCC 11) только
std::string_view
имеет
constexpr
функциональность в libstdc++.
Тривиальный пример constexpr: https://godbolt.org/z/Ejosx43bM
Добавление фиксации содержит () в libstdc ++ для GCC 11: https://gcc.gnu.org/git/?p=gcc.git;a=commitdiff;h=f004d6d9fab9fe732b94f0e7d254700795a37f30