// Queue对象.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <string>
#include <vector>
#include <map>
#include <algorithm>
using namespace std;
typedef unsigned int uint;
#define RETURN_IF(a,b) if(a){return b;}
uint g_RecordInQueTime = 0;
typedef struct tag_ObjAtribute
{
uint ObjId;
int ObjType;
uint ObjWeight;
uint ObjInTime;
}ObjAtribute;
typedef struct tag_QueAtribute
{
uint QueId;
int QuePri;
uint QueLen;
vector<ObjAtribute> QueForObj;
}QueAtribute;
vector<QueAtribute> QueTotal;
map<unsigned int,unsigned int> ObjTypeQueID;
int CreateQue(unsigned int QueID, unsigned int QuePri, unsigned int QueLen)
{
RETURN_IF(QueID < 1 || QueID >5 || QuePri <1 || QuePri >5 || QueLen <1 || QueLen > 0xFFFFFFFF,-1);
vector<QueAtribute>:: iterator Index;
for (Index = QueTotal.begin(); Index != QueTotal.end();Index++)
{
if (Index->QueId == QueID)
{
return -1;
}
}
QueAtribute InitQue;
InitQue.QueId = QueID;
InitQue.QuePri = QuePri;
InitQue.QueLen = QueLen;
QueTotal.push_back(InitQue);
return 0;
}
int SetObjTypeToQue(unsigned int ObjType, unsigned int QueID)
{
RETURN_IF(QueID < 1 || QueID >5 || ObjType <1 || ObjType >5 ,-1);
vector<QueAtribute>::iterator Index;
for(unsigned int i = 0; i < QueTotal.size(); i++)
{
if (QueTotal[i].QueId == QueID)
{
map<unsigned int,unsigned int> :: iterator Index;
Index = ObjTypeQueID.find(ObjType);
RETURN_IF(Index != ObjTypeQueID.end(), -1);
ObjTypeQueID.insert(pair<unsigned int,unsigned int>(ObjType,QueID));
return 0;
}
}
return -1;
}
int PushObj(unsigned int ObjId, unsigned int ObjType, unsigned int ObjWeight)
{
//RETURN_IF(ObjId < 1 || ObjId >5 || ObjType <1 || ObjType >5 || ObjWeight <1 || ObjWeight > 0xFFFFFFFF,-1);
uint MinWeight = ObjWeight;
vector<ObjAtribute>::iterator Position;
map<uint,uint>:: iterator Index;
Index = ObjTypeQueID.find(ObjType);
RETURN_IF(Index == ObjTypeQueID.end(), -1);
int QueID = Index->second;
for (uint i = 0; i < QueTotal.size(); i ++)
{
if (QueTotal[i].QueId == QueID)
{
for (vector<ObjAtribute>::iterator Index = QueTotal[i].QueForObj.begin(); Index != QueTotal[i].QueForObj.end(); Index++)
{
RETURN_IF(Index->ObjId == ObjId, -1);
if (Index->ObjWeight < MinWeight)
{
MinWeight = Index->ObjWeight;
Position = Index;
}
}
if (QueTotal[i].QueLen == QueTotal[i].QueForObj.size() )
{
if (ObjWeight > MinWeight)
{
QueTotal[i].QueForObj.erase(Position);
}
else{return -1;}
}
g_RecordInQueTime ++;
ObjAtribute InitObj;
InitObj.ObjId = ObjId;
InitObj.ObjType = ObjType;
InitObj.ObjWeight = ObjWeight;
InitObj.ObjInTime = g_RecordInQueTime;
QueTotal[i].QueForObj.push_back(InitObj);
return 0;
}
}
return -1;
}
int printVector(vector<ObjAtribute> &Vec)
{
return 0;
}
int PopObj(unsigned int *ObjId)
{
RETURN_IF(0 == ObjId, -1);
int MaxPri = 0;
uint Position = 0;
vector<ObjAtribute>::iterator MaxPriIndx;
vector<ObjAtribute>::iterator Index;
for (uint i = 0; i < QueTotal.size(); i ++)
{
if (QueTotal[i].QuePri > MaxPri &&QueTotal[i].QueForObj.size() != 0)
{
MaxPri = QueTotal[i].QuePri;
Position = i;
}
}
printVector(QueTotal[Position].QueForObj);
for (Index = QueTotal[Position].QueForObj.begin(); Index != QueTotal[Position].QueForObj.end(); Index ++)
{
if (Index->ObjWeight > MaxPri)
{
MaxPri = Index->ObjWeight;
MaxPriIndx = Index;
}
else if (Index->ObjWeight = MaxPri)
{
if (Index->ObjInTime < MaxPriIndx ->ObjInTime)
{
MaxPriIndx = Index;
}
}
}
*ObjId = 0;
if (MaxPri != 0)
{
*ObjId = MaxPriIndx->ObjId;
QueTotal[Position].QueForObj.erase(MaxPriIndx);
}
return 0;
}
int main()
{
CreateQue(1,1,20) ;
CreateQue(2,2,10);
SetObjTypeToQue(1,1);
SetObjTypeToQue(2,1);
SetObjTypeToQue(3,2);
PushObj(111,1,222);
PushObj(112,2,223);
PushObj(113,1,223);
PushObj(114,2,225);
PushObj(115,3,300);
unsigned int ObjID = 0;
for (int i = 0; i < 5; i ++)
{
PopObj(&ObjID);
printf("%d\n",ObjID);
}
return 0;
}
对象+队列
最新推荐文章于 2021-02-16 23:25:19 发布