【问题标题】:How to call a function with a different string starting points?如何调用具有不同字符串起点的函数?
【发布时间】:2018-06-10 05:39:37
【问题描述】:

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

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

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

【问题讨论】:

  • 你可以把它变成一个 C 字符串,增加指针并再次使它成为一个 std::string
  • sry,下次我应该小心标签
  • @RanElgiser 你是说将字符串转换为字符数组吗?
  • findall 究竟应该做什么?它似乎没有找到任何东西?
  • 此函数用于检查第一个字符是否 >0 以及第一个和第二个字符的总和是否 >0 和

标签: c++ string c++11


【解决方案1】:

我相信这对于 c++ std::strings 是不可能的;但是,如果您可以转换函数以便将开始和结束迭代器作为输入,那么您可以这样调用它:

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

使用这种方法还可以避免不必要的复制。

【讨论】:

  • 你听说过std::basic_string::substr吗?
  • @bipll substr 创建子字符串的副本,这个答案避免了。
  • @JohnKugelman 正是如此,那又怎样? “避免”并不完全是“不可能”。
【解决方案2】:

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 不拥有数据(它只是一个指针和大小对),而string_viewsubstr 只是同一字符串数据上的一个notehr string_view。

无论什么 const char* 或 string 都可以隐式转换为 string_view,所以无论如何你都可以调用这个函数。

无论如何,我仍然完全不清楚该函数的目的应该是什么以及动词“find”的含义。

【讨论】:

  • 正如您所指出的, string_view 非常适合 OP 的要求。但值得注意的是 string_view 是 C++17 并且问题被标记为 C++11。
  • @definecindyconst:我多次看到错误的标签,我会让 OP 来决定。
猜你喜欢
  • 2012-08-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-15
相关资源
最近更新 更多