簡體   English   中英

std :: list嚴格弱排序

[英]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<bb<a都是正確的。

在這種情況下,也許應該return false ,因為a==b ,因此!a<b

另外,您的第二組比較令人困惑..什么是m_bHasCarbon

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM