如何使用不同的字符串起始点调用函数?

时间:2018-06-10 05:39:38

标签: c++ string c++11

我有一个带字符串的函数。我想用不同的起点递归调用这个函数。

int findall(string str){
    if(str.length()<=2){
        return 0;
    }
    return findall(str+1)+findall(str+2);
}

如何递归调用字符串的第2和第3个位置?

2 个答案:

答案 0 :(得分:4)

我认为c ++ std::string s无法做到这一点;但是,如果你可以转换函数,使它以开始和结束迭代器作为输入,那么你可以像这样调用它:

int findall(std::string::const_iterator begin, std::string::const_iterator end){
    if ((end - begin) <= 2) {
        return 0;
    }
    return findall(begin + 1, end) + findall(begin + 2, end);
}

使用此方法,您还可以避免不必要的复制。

答案 1 :(得分:1)

str+1什么都没有。

使用

可以实现相同的语义
int findall(string str)
{
    if(str.length()<=2)
    {  return 0;  }
    return findall(str.substr(1))+findall(str.substr(2));
}

不幸的是,每次需要子字符串时都会生成字符串副本。 由于您不需要修改它们,因此

可以提高效率
int findall(string_view str)
{
    if(str.length()<=2)
    {  return 0;  }
    return findall(str.substr(1))+findall(str.substr(2));
}

string不同,string_view不拥有数据(它只是一个指针和尺寸对)而substr的{​​{1}}只是anotehr string_view对相同的字符串数据。

无论const char *或字符串是否可以隐式转换为string_view,所以无论如何都可以调用此函数。

无论如何,这个功能的目的应该是什么以及动词&#34;发现&#34;意思是。