【问题标题】:Quickly processing a string快速处理字符串
【发布时间】:2017-06-07 11:17:05
【问题描述】:

我有一个输入字符串,我将使用它来构建一个输出字符串。输出字符串与输入字符串大致相同,但沿途有一些细微的变化,这取决于我们是否在输入中点击了某些字符。代码是这样的

outputTree(std::ostream& o, const char* input) {
    size_t len = strlen(input);
    int indent = 0;
    string output;

    for(size_t i = 0; i < input_len; i++) {
        if(input[i] == '(') {
            indent++;
            output.append(1,'\n');
            for(int j = 0; j < indent; j++) {
                output.append("    ");
            }
        }
        if(input[i] == ')') {
            output.append(1,'\n');
            for(int j = 0; j < indent; j++) {
                output.append("    ");
            }
            indent--;
        }
        output.append(1,input[i]);
    }
    o << output << endl;
}

虽然这可行,但逐个字符执行此操作非常慢。谁能推荐一些更好的方法(使用标准功能,即没有提升)?

【问题讨论】:

  • 如果代码有效,那么我建议您在codereview.stackexchange.com 上进行审核。
  • 作为一个快速建议,for(int j = 0; j &lt; indent; j++) { output.append(" "); } 部分可以移动到单独的函数中
  • 你写信给output是为了什么?直接写信给o,好多了。此外,您也可以直接从istream 阅读。
  • is pretty slow - 你是如何测量的?您是否尝试过优化构建?
  • 我投票决定将此问题作为题外话结束,因为它是Code Review

标签: c++ string algorithm optimization


【解决方案1】:

我不确定“相当慢”是什么意思以及您期望的改进程度。您拥有的算法是一种有效的 O(N) 算法。您唯一能做的就是尝试优化单个操作,但是我又不确定编译器在做什么类型的优化。

您可以做的一件事是摆脱在缩进级别(您的indent 变量)需要多次写入缩进字符串的内部循环。因此,无需编写换行符,然后执行for 循环,您只需执行一个将换行符与正确数量的缩进连接起来的追加。如果您可以设置缩进深度的限制(比如 10 级深度),那么您可以创建一个包含所有 10 个不同缩进字符串(所有字符串都以换行符开头)的数组。

您可以尝试的另一件事是使用std::string::find 查找'(' 和')' 的出现并将字符串复制到这些标记,而不是逐个字符地复制。

最后,请注意,如果输入与预期不符,您的代码可能不会按您希望的方式运行。注意如果你第一次遇到没有对应的 '(' 的 ')' 会发生什么。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-08-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-30
    • 2013-01-20
    • 2016-11-27
    相关资源
    最近更新 更多