我有一个算法,它是解析函数I的一个数学方程式。它位于当前字符(c
或*it
)被确定为面向右侧的paranthesis (
的部分内,并且应该增加it
直到它找到闭幕式。
/* Iterate until the current character is the closing paranthesis or is off the end of the equation string */
std::string::const_iterator opi = it;
++it;
for (int nrfp = 1; nrfp > 0 && it != offend; c = *++it)
{
if (c == ')') --nrfp;
else if (c == '(') ++nrfp;
}
if (it == offend) throw "Unbalanced parantheses";
/* If we're here, the current character is the closing paranthesis, meaning the characters in the range (opi, it) are the inside of the paranthesis */
/* Check that the paranthesis are not empty */
if ((it - opi) == 1) throw "Empty paranthesis";
作为参考,opi
应该表示"打开paranthesis iterator"并且nrfp
应该表示"面向右边的paranthesis的数量"并且offend
是I' m iteratring through的字符串end()
的迭代器。
如何在可读性,性能和现代性方面改进这一点,而不会在3中有任何妥协?是否有我应该利用的标准库算法?
答案 0 :(得分:1)
我认为你唯一需要做的就是:不要抛出字符串文字。而是抛出一个异常类的对象(最终)派生自std::exception
。
例如。替换这个:
if (it == offend) throw "Unbalanced parantheses";
与
if (it == offend) throw std::runtime_error("Unbalanced parantheses");
或std::logic_error
或其他(更具体)类的实例。此修改将允许您优雅地捕获异常。阅读有关例外的更多信息。