Заменить подстроку внутри строки (c ++) - PullRequest
1 голос
/ 09 февраля 2011

Я строю свой собственный класс String и хочу написать свой собственный метод замены для класса

Однако я не знаю, как получить позицию (int) первого вхождения подстроки внутристрока.

Мой метод замены должен принимать 2 аргумента: String searchString, String newString.Это работает так:

String example="AppLe";

example.replace("L", "banana");

Мне нужно как-то получить позицию L внутри строки примера.чтобы моя функция замены имела результат "Appbananae"

Пожалуйста, обратите внимание, что я пишу свой собственный класс String, потому что я прохожу курс обучения объектно-ориентированному программированию в школе, чтобы узнать о классах.Из-за этого я не могу использовать "find ()" из стандартного строкового класса библиотеки, потому что это разрушает цель.Большое спасибо

Ответы [ 3 ]

2 голосов
/ 09 февраля 2011

Хотя это не может быть прямой помощью, это практично: я предлагаю использовать стандартные строки библиотеки, а не пытаться создать свой собственный класс.Это требует времени и должно быть подвержено ошибкам.

1 голос
/ 09 февраля 2011

Предполагая, что ваш строковый класс будет хранить текущее значение в буфере ASCIIZ, вы можете использовать strstr().

0 голосов
/ 09 февраля 2011

Пожалуйста, обратите внимание, что я пишу свой собственный класс 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>

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...