multiset这个数据结构从网上查下来看应该是一个在生成时自动排序的数据结构,我的理解是排序的依据就是这个compare函数 但是写了下测试代码,从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; |
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,这该怎么解决呢 |