在Shunting Yard中处理带括号的表达式

时间:2012-07-12 09:43:05

标签: c++ loops code-readability stl-algorithm shunting-yard

我有以下手写循环来处理带括号的表达式:

while (!punctuators.empty() && punctuators.back().kind != '(')
{
    output.push_back(punctuators.back());
    punctuators.pop_back();
}
if (punctuators.empty())
    throw invalid_expression(") without matching matching (");
punctuators.pop_back();

outputpunctuators都属于std::vector<token>,其中token是一个非常简单的struct,由char kind组成unsigned value数据成员。)

我想知道从手写循环切换到算法是否会提高可读性:

auto p = std::find_if(punctuators.rbegin(), punctuators.rend(),
                      [](token t){ return t.kind == '('; });
if (p == punctuators.rend())
    throw invalid_expression(") without matching matching (");
output.insert(output.end(), punctuators.rbegin(), p);
punctuators.erase(std::prev(p.base()), punctuators.end());

但不知怎的,我觉得这段代码的可读性要低得多,可能是因为使用了反向迭代器,特别是转换为普通迭代器。有更好的解决方案吗?您是否同意手写循环更具可读性,或者在算法方面我是否只是看不到光?

1 个答案:

答案 0 :(得分:2)

您只需要正确的算法。

(未经测试的代码)

boost::algorithm::copy_while ( 
    punctuators.rbegin (), punctuators.rend (), 
    std::back_inserter ( output ),
    [](token t){ return t.kind != '('; });

如果你没有使用提升,你可以很容易地自己写copy_while

算法并不神奇;你应该养成自己写作的习惯。