其他分享
首页 > 其他分享> > c – 递归传递一个字符串而不重新创建

c – 递归传递一个字符串而不重新创建

作者:互联网

我在这里回答了一个问题:https://stackoverflow.com/a/28862668/2642059我需要使用重复来逐步执行字符串.我想使用一个const字符串&作为我在每个函数上的参数,但除非我想重建字符串每次递归,我发现我需要传递一个开始和结束位置以及字符串本身.所以传递字符串变得毫无意义.

最后,我选择只传递一个指向char []的开始和结束指针.

举个例子,假设我给了一个包含嵌套括号的字符串(但没有并排的括号插入.)所以这样:

(abc(def(ghi((j)klm)nop)qrs)tuv)wxyz

但不是这样的:

(abc(def)(ghi)(j)(klm)(nop)(qrs)tuv)wxyz

我想编写一个递归程序来提取最深嵌套括号中的字符串.就像是:

string foo(const string& bar){
    auto start = bar.find('(') + 1;

    return start == string::npos + 1 ? bar : foo(bar.substr(start, bar.find_last_of(')') - start));
}

但是,我很不高兴为foo的每次重复重建一个字符串.另一种方法是在链接示例中传递开始和结束指针(或传递string :: const_iterators.)

是否有一个包装器或允许我使用字符串功能但不重建字符串的东西?

解决方法:

string_view从图书馆基础知识TS可能是一个想法,在GCC中可以获得支持.

界面几乎与字符串相同

#include <experimental/string_view>
using std::experimental::string_view;

string_view foo(const string_view& bar){
    auto start = bar.find('(') + 1;

    return start == string_view::npos + 1 ? bar : foo(bar.substr(start, bar.find_last_of(')') - start));
}

最后一行也可以

return start ? foo(bar.substr(start, bar.find_last_of(')') - start)) : bar;

虽然他们都非常神秘.

标签:char-pointer,c,string,recursion,construction
来源: https://codeday.me/bug/20190928/1825574.html