替换字符串中的子字符串(c ++)

时间:2011-02-09 01:17:53

标签: c++ string

我正在构建自己的String类 我想为类

编写自己的替换方法

但是我不知道如何获取字符串中第一次出现的子串的位置(int)。

我的replace方法应该有2个参数,String searchString,String newString。它像这样工作

String example="AppLe";

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

我需要以某种方式获取示例字符串中L的位置。我的替换功能有“Appbananae”

请注意我正在编写自己的String类,因为我正在学校学习有关课程的面向对象编程课程。因此我不能使用标准库字符串类中的“find()”,因为这会破坏目的。非常感谢

3 个答案:

答案 0 :(得分:2)

虽然这可能没有直接帮助,但它很实用:我建议使用标准库字符串,而不是尝试构建自己的类。这需要时间并且必然容易出错。

答案 1 :(得分:1)

假设您的字符串类将当前值存储在ASCIIZ缓冲区中,您可以使用strstr()

答案 2 :(得分:0)

  

请注意我正在编写自己的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 :: equal更加冗长,因为你不知道距离(b_begin,b_end)&lt; = distance(a_begin,a_end)和std :: equal有这个要求。