Пожалуйста, обратите внимание, что я пишу свой собственный класс String, потому что я прохожу курс обучения объектно-ориентированному программированию в школе, чтобы узнать о классах.Из-за этого я не могу использовать "find ()" из стандартного строкового класса библиотеки, потому что это разрушает цель.
Не имеет смысла использовать стандартный строковый класс библиотеки, но это имеет смыслиспользовать независимые от контейнера алгоритмы:
template<class ForwardIterator1, class ForwardIterator2>
ForwardIterator1 search(ForwardIterator1 first1, ForwardIterator1 last1,
ForwardIterator2 first2, ForwardIterator2 last2);
template<class ForwardIterator1, class ForwardIterator2, class BinaryPredicate>
ForwardIterator1 search(ForwardIterator1 first1, ForwardIterator1 last1,
ForwardIterator2 first2, ForwardIterator2 last2,
BinaryPredicate pred);
Возвращает: Первый итератор i в диапазоне [first1, last1 - (last2 - first2)), такой что для любого не-отрицательное целое число n меньше, чем last2 - first2 выполняются следующие соответствующие условия: * (i + n) == * (first2 + n), pred (* (i + n), * (first2 + n))! = false.Возвращает last1, если такой итератор не найден.
[Источник: C ++ 03 §25.1.9]
Std :: search делает именно то, что вы хотите сделать.Если вам все еще не разрешено использовать алгоритмы, не зависящие от контейнера, вы можете реализовать std :: search самостоятельно под новым именем и использовать его.(Такое предотвращение в std :: search является требованием мозговых мертвецов именно потому, что вы можете точно имитировать его, не полагаясь на какие-либо подробности вашего класса String.)
Здесь наивно (имеется в виду, очевидно, и это работает, но, возможно,медленнее, чем возможно) реализация:
template<class IterA, class IterB>
IterA search(IterA a_begin, IterA a_end, IterB b_begin, IterB b_end) {
for (IterA start = a_begin; start != a_end; ++start) {
IterA a = start;
for (IterB b = b_begin; a != a_end; ++b, ++a) {
if (b == b_end) return start;
if (*b != *a) break;
}
}
return a_end;
}
Обратите внимание, что из этой реализации более подробно вызывать std :: равно из-за того, что вы не знаете это расстояние (b_begin, b_end) <= distance (a_begin, a_end)и std :: equal имеет это требование. </p>