我正在构建自己的String类 我想为类
编写自己的替换方法但是我不知道如何获取字符串中第一次出现的子串的位置(int)。
我的replace方法应该有2个参数,String searchString,String newString。它像这样工作
String example="AppLe";
example.replace("L", "banana");
我需要以某种方式获取示例字符串中L的位置。我的替换功能有“Appbananae”
请注意我正在编写自己的String类,因为我正在学校学习有关课程的面向对象编程课程。因此我不能使用标准库字符串类中的“find()”,因为这会破坏目的。非常感谢
答案 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有这个要求。