括弧で囲まれた式を処理するために、次の手書きのループがあります。
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>
で、は aとデータ メンバーで構成される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());
しかし、どういうわけか、おそらく逆イテレータの使用と、特に通常のイテレータへの変換が原因で、このコードはかなり読みにくいと感じています。より良い解決策はありますか?手書きのループの方が読みやすいと思いますか?それとも、アルゴリズムに関しては、まだ光が見えていないだけですか?