我有一个带字符串的函数。我想用不同的起点递归调用这个函数。
int findall(string str){
if(str.length()<=2){
return 0;
}
return findall(str+1)+findall(str+2);
}
如何递归调用字符串的第2和第3个位置?
答案 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;意思是。