[英]std::list Strict Weak Ordering
我在使用std :: list :: sort函数时遇到了很多麻烦,它在大多数情况下都有效,但是偶尔也会抛出一个断言“无效的运算符<”。 在研究这个问题时,我已经意识到这是因为我的排序函数未遵循严格的弱排序,但是当我查看代码时,我不明白为什么它没有遵循严格的弱排序,因为它看起来正确,我缺少了什么这里?
此函数的目的是根据Hill系统(即)将元素列表分类为公式字符串。 碳第一,氢第二,所有其他按字母顺序排列。 FormulaStruct仅表示完整配方中的单个元素和数量。
struct FormulaStruct
{
FormulaStruct(const std::string & strSymbol, int nNum, bool bHasCarbon)
:
m_strSymbol(strSymbol),
m_nNum(nNum), m_bHasCarbon(bHasCarbon)
{
}
bool operator < (const FormulaStruct & rhs)
{
//If the symbols are equal
if(m_strSymbol == rhs.m_strSymbol)
return true;
if(m_bHasCarbon)
{
if(m_strSymbol == "C")
return true;
else
if(rhs.m_strSymbol == "H")
return false;
}
return m_strSymbol < rhs.m_strSymbol;
}
bool operator == (const FormulaStruct & rhs)
{
return m_strSymbol == rhs.m_strSymbol;
}
std::string m_strSymbol;
int m_nNum;
bool m_bHasCarbon;
};
list<FormulaStruct> FormulaList; //A list of FormulaStructs, assumed to be filled
FormulaList.sort();
编辑 bHasCarbon是公式中有碳的条件,因为希尔系统要求,如果公式中有碳,那么下一个是氢,否则,所有字母都是字母,包括氢,这在我的代码的另一部分中规定。
其他答案已经解决了m_strSymbol == rhs.m_strSymbol
问题。
但是,根据您的描述(首先是“ C”,然后是“ H”,其他所有顺序都可以) ,如果您使用的是C ++ 11,则似乎需要这样做:
return std::tie(m_strSymbol != "C", m_strSymbol != "H", m_strSymbol)
< std::tie(rhs.m_strSymbol != "C", rhs.m_strSymbol != "H", rhs.m_strSymbol);
这是写StrictWeakOrderings的简单方法(从这里偷来的 )
或者,如果您没有C ++ 11(或Boost低于C ++ 11),则可以执行以下操作:
// order of checks here is important, in case both are "C"
if(rhs.m_strSymbol == "C")
return false;
if(m_strSymbol == "C")
return true;
// neither symbol is "C"
if(rhs.m_strSymbol == "H")
return false;
if(m_strSymbol == "H")
return true;
// neither symbol is "C" or "H"
return m_strSymbol < rhs.m_strSymbol;
我敢肯定我做对了,但是正如上面发布的文章中所述,手动执行容易出错,并且应该避免...而且,可以肯定的是,可以进一步对其进行优化,以减少字符串比较的次数,冒引入错误和混淆代码的风险。
但是,尚不清楚m_bHasCarbon的含义以及应该产生的效果,因此我不确定这是否是您所需要的。
//If the symbols are equal
if(m_strSymbol == rhs.m_strSymbol)
return true;
这意味着如果符号相等,则对于a<b
和b<a
都是正确的。
在这种情况下,也许应该return false
,因为a==b
,因此!a<b
。
另外,您的第二组比较令人困惑..什么是m_bHasCarbon
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.