2011-02-09 34 views
1

我建立我自己的String类 ,我想写我自己的替代方法的类替换子字符串(C++)内

但是我不知道怎么弄的位置(INT )在字符串中出现的第一个子字符串。

我的替换方法应该有2个参数,String searchString,String newString。它的工作原理是这样的

String example="AppLe"; 

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

我需要以某种方式获得L内的示例字符串的位置。因为我的替换函数的结果是“Appbananae”

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

+2

介绍[for-loop](http://en.wikipedia.org/wiki/For_loop)。 – Marlon 2011-02-09 01:23:57

+3

*“我正在建立自己的弦乐班,并...”*哦,我的,不是再... – Oystein 2011-02-09 01:43:26

回答

1

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

2

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

+3

人们经常编写字符串类作为学习练习。 – 2011-02-09 01:48:31

0

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

它不会是有意义的使用标准库string类,但它确实是有意义的使用容器无关的算法:

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); 

返回:第一个迭代我在范围[first1,last1 - (last2 - first2)),使得对于任何小于last2 - first2的非负整数n,下列对应条件成立:*(i + n)== *(first2 + n),pred(* (i + n),*(first2 + n))!= false。如果没有找到这样的迭代器,则返回last1。

[来源:C++ 03§25.1.9]

的std ::搜索不正是你想做的事。如果你仍然不被允许使用容器不可知的算法,那么你可以用一个新名字自己实现std :: search并使用它。 (对std :: search的这种预防正是因为你可以完全模仿它,而不依赖于你的String类的任何细节),所以对std :: search的预防是正确的。)

这是一个天真(意义明显,它的工作原理,但也许更慢比可能的)实现:

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)< =距离(a_begin,a_end),和std: :平等有这个要求。