2017-10-05 94 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。 –