Code Bye

有关std::multiset 中compare函数的作用

 

multiset这个数据结构从网上查下来看应该是一个在生成时自动排序的数据结构,我的理解是排序的依据就是这个compare函数
我现在的需求是实现一个优先级队列,有两个级别的优先级, priority 1和priority 2
首先比较priority 1,其次比较priority 2,我的函数是这样实现的
struct ReqTaskMsgCompare{
bool operator() (const ReqTaskMsg* pMsg1, const ReqTaskMsg* pMsg2)
{
if(pMsg1->Priority1>pMsg2->Priority1)
{
if(pMsg1->Priority2>pMsg2->Priority2)
{
return true;
}
else
{
return false;
}
}
else
{
return false;
}
}
};

但是写了下测试代码,从visual studio里面看排序,似乎不是我想象的那样子,数据看起来完全是无规律排序的,这是什么原因呢

 
bool operator() (const ReqTaskMsg* pMsg1, const ReqTaskMsg* pMsg2)
{
if(pMsg1->iJobPriority>=pMsg2->iJobPriority)
{
if(pMsg1->iSessionPriority>pMsg2->iSessionPriority)
{
return true;
}
else
{
return false;
}
}
else
{
return false;
}
}

我把函数改成这样了,但是,如果我输入同样的iJobPriority的话,排序是正常的,我iJobPriority和iSessionPriority全部随机输入的话,排序就有点乱了

10分

//    标准
struct classcomp
 {
  bool operator() (const int& lhs, const int& rhs) const
 {return lhs<rhs;}             // 第一参数小于第二参数为真
};

//  楼主 为
struct ReqTaskMsgCompare{
        bool operator() (const ReqTaskMsg* pMsg1, const ReqTaskMsg* pMsg2)
        {
           if(pMsg1->Priority1>pMsg2->Priority1 && pMsg1->Priority2>pMsg2->Priority2)    // 倒序
              return true;
           else return false;
       };
};
//   估计想为
struct ReqTaskMsgCompare{
        bool operator() (const ReqTaskMsg* pMsg1, const ReqTaskMsg* pMsg2)
        {
           if(pMsg1->Priority1 < pMsg2->Priority1)
               return true;
           else if (pMsg1->Priority1 == pMsg2->Priority1 &&
                       pMsg1->Priority2 < pMsg2->Priority2)
                         return true;
           return false;
       };
};

30分

// 如果需要逆序(从大到小),把小于号改为大于号
if( pMsg1->iJobPriority < pMsg2->iJobPriority )
{
    return true;
}
else if( pMsg1->iJobPriority == pMsg2->iJobPriority )
{
    if( pMsg1->iJobPriority < pMsg2->iJobPriority )
        return true;
}

return false;
 
http://www.cplusplus.com/reference/set/multiset/index.html
 
compare就是operator<的意思
set是树,优先队列考虑用priority_queue
 
感谢楼上,问题解决了,顺便问下这个set修改的问题,是这样的,我写了一个迭代器遍历这个set
for (SETREQTASKMSGITR setIt = m_IndexTable.begin(); setIt != m_IndexTable.end(); ++setIt)
{
if(某种条件)
{
m_IndexTable.erase(setIt);
m_IndexTable.insert(iJobPriority);
}
}
这个循环再满足条件以后,再次++setIt会crash,这该怎么解决呢

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明有关std::multiset 中compare函数的作用