我怎样才能使这段 C++ 代码现代化?
How can I modernify this piece of C++ code?
我有一个算法,它是我正在编写的数学方程式解析函数的一部分。它位于当前字符(c
或 *it
)已被确定为右括号 (
的部分内,并且应该递增 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
应该表示 "opening paranthesis iterator",nrfp
应该表示 "number of right-facing paranthesis",而 offend
是 [= 的迭代器我正在遍历的字符串的 18=]。
我怎样才能在可读性、性能和现代性方面提高它,同时又不在这三者之间做出任何妥协?是否有我应该利用的标准库算法?
我认为您唯一需要做的是:不要抛出字符串文字。而是抛出一个异常对象 class(最终)派生自 std::exception
.
例如。替换为:
if (it == offend) throw "Unbalanced parantheses";
和
if (it == offend) throw std::runtime_error("Unbalanced parantheses");
或 std::logic_error
的实例,或其他一些(更具体的)class。此修改将使您能够优雅地捕获异常。详细了解异常。
我有一个算法,它是我正在编写的数学方程式解析函数的一部分。它位于当前字符(c
或 *it
)已被确定为右括号 (
的部分内,并且应该递增 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
应该表示 "opening paranthesis iterator",nrfp
应该表示 "number of right-facing paranthesis",而 offend
是 [= 的迭代器我正在遍历的字符串的 18=]。
我怎样才能在可读性、性能和现代性方面提高它,同时又不在这三者之间做出任何妥协?是否有我应该利用的标准库算法?
我认为您唯一需要做的是:不要抛出字符串文字。而是抛出一个异常对象 class(最终)派生自 std::exception
.
例如。替换为:
if (it == offend) throw "Unbalanced parantheses";
和
if (it == offend) throw std::runtime_error("Unbalanced parantheses");
或 std::logic_error
的实例,或其他一些(更具体的)class。此修改将使您能够优雅地捕获异常。详细了解异常。