2017-10-05 91 views
0

我不確定是否正確理解文檔。我想爲QMultiMap定義我自己的<()運算符,以便使用自定義類型並定義特定的values(const Key &key)行爲。QMap運算符<()

的期望的行爲是檢索所有具有相同組與檢索鍵(SRC)的事件,並且所述一個src中的初始部分相匹配的有效載荷的字符串的值。示例:

我的地圖中某個鍵的有效載荷可能是:「HUB,PRESS *」。 如果一個src匹配組和事件值並具有以下有效載荷:「HUB,PRESS,3」應檢索上述元素(因爲src有效載荷以相同字符串部分開頭)。

這裏我實現的:

struct event_t { 
    int group; 
    int event;  
    QString payload; 
}; 

inline bool operator <(const event_t &e1, const event_t &e2) 
{ 
    if (e1.group != e2.group) return e1.group < e2.group; 
    if (e1.event != e2.event) return e1.event < e2.event; 

    if (e2.payload.endsWith("*\"")) 
    { 
     qDebug() << e1.payload << e2.payload; 
     QString s2 = e2.payload.mid(0, e2.payload.size() - 2); 
     QString s1 = e1.payload.mid(0, s2.size()); 
     s1.append("\""); 
     s2.append("\""); 
     return s1 < s2; 
    } 

    return e1.payload < e2.payload; 
} 

這裏一個簡單的例子:

QMultiMap<event_t, event_t> m_map; 
// fill with some items, one has the key like: "HUB,PRESS*" 

event_t src; 
// populate it 

QList<event_t> dst = m_map.values(src); 

的問題是我從來沒有看到對現有項目的src調試打印(如我從values()期待code)。相反,我的qDebug()爲e1e2(存儲在我的地圖中)打印相同的值,而不是src。即:

"\"HUB,PRESS*\"" "\"HUB,PRESS*\"" 

也許我不明白這應該是如何工作的?

+0

是的,我敢肯定。測試我把它設置爲:'src.payload =「\」「+」HUB,PRESS,3「+」\「」;' – Mark

+0

@StoryTeller對不起,您是對的。我是一個固件的傢伙,我已經習慣用C ... – Mark

+0

寫@drescherjm該行的作品,我可以看到qDebug()輸出!問題是我無法像示例中那樣匹配字符串的開頭。 – Mark

回答

0

這裏的工作代碼:

inline bool operator <(const event_t &e1, const event_t &e2) 
{ 
    if (e1.group != e2.group) return e1.group < e2.group; 
    if (e1.event != e2.event) return e1.event < e2.event; 

    if (e1.payload.endsWith("*\"")) 
    { 
     QString s1 = e1.payload.mid(0, e1.payload.size() - 2); 
     QString s2 = e2.payload.mid(0, s1.size()); 
     s1.append("\""); 
     s2.append("\""); 
     return s1 < s2; 
    } 

    return e1.payload < e2.payload; 
} 

我不知道爲什麼,但src值被包含在E1,而不是E2,因爲我是從預期值()實現。

+0

您可能還需要重載'>'以確保'e2> e1'的結果是正確的。 –

+0

@代碼HiI'mFrogatto我無法找到使用'qMapGreaterThanKey',但只'qMapLessThanKey'。還要檢查此評論:https://github.com/qt/qtbase/blob/5b24d3dd3559826dfa3cac38be525a052003e2a8/src/corelib/tools/qmap.h#L63 – Mark

+0

如果兩件事情具有可比性,它們之間的可比性應在所有情況下舉行,不僅使用一個QMap。 –