У меня есть подстрока, определенная двумя итераторами (start
а также end
). Мне нужно проверить, присутствует ли эта подстрока в другой строке.
Существует ли стандартный библиотечный алгоритм или строковый член, который я могу использовать или адаптировать для этого, не создавая совершенно новый строковый объект (std::string(start, end)
) только для этого?
например
struct Substring
{
std::string::const_iterator start, end;
};
auto found = std::contains(whole.begin(), whole.end(), substring.start, substring.end); // ???
bool found =
std::search(hay.begin(), hay.end(), needle.begin(), needle.end()) != hay.end();
Вы можете использовать std::string::find
метод:
auto found = (whole.find(&*substring.start, 0, substring.end - substring.start)
!= std::string::npos);
Преимущество над std::search
в том, что std::find
работает со строками и может быть реализован с помощью Бойера-Мура. К сожалению, это не то, как в gcc libstdc ++ это реализует.