Очевидное решение:
bool
match( std::string const& pattern, std::string const& text )
{
return std::search( text.begin(), text.end(),
pattern.begin(), pattern.end() )
!= text.end();
}
Это идиоматический C ++, и я ожидаю, что любой программист C ++
напишите это, по крайней мере, в профессиональной среде.
Если цель состоит в том, чтобы научиться писать такую функцию, то, конечно,
вышеупомянутое не большая часть решения. Решение тогда должно быть мрое
разделяй и властвуй; слишком много в match
, чтобы вы могли это выразить
в одной функции. Я бы порекомендовал что-то вроде:
bool
startsWith( std::string::const_iterator begin,
std::string::const_iterator end,
std::string const& pattern )
{
return end - begin >= pattern.size()
&& std::equal( pattern.begin(), pattern.end(), begin );
}
bool
match( std::string const& pattern, std::string const& text )
{
std::string::const_iterator current = text.begin();
while ( current != text.end()
&& !startsWith( begin, text.end(), pattern ) ) {
++ current;
}
return current != text.end();
}
Это, очевидно, можно улучшить; например, нет смысла в
продолжается в цикле while, когда длина оставшегося текста
меньше длины шаблона.
И если ваш профессор настаивает на том, чтобы вы использовали char const*
(если он настаивает
на char*
, тогда он совершенно некомпетентен и должен быть уволен), это
можно легко переписать для этого: просто замените все вызовы на begin
на
указатель и все звонки на end
с pointer + strlen(pointer)
.