我有以下手写循环来处理带括号的表达式:
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();
(output
和punctuators
都是类型std::vector<token>
,其中token
是由char kind
和unsigned value
数据成员组成的非常简单的struct
。)
我想知道从手写循环切换到算法是否会提高可读性:
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());
但不知何故,我觉得这段代码可读性差了很多,可能是因为使用了反向迭代器,尤其是转换为正常迭代器。有更好的解决方案吗?你会同意手写循环更可读吗?还是我只是在算法方面还没有看到曙光?
您只需要正确的算法。
(未测试代码)
boost::algorithm::copy_while (
punctuators.rbegin (), punctuators.rend (),
std::back_inserter ( output ),
[](token t){ return t.kind != '('; });
如果你不使用boost,你可以很容易地自己编写copy_while
。
算法并没有什么神奇之处;你应该养成自己写作的习惯。