我目前有一个队列,其中包含用户指定数量的名为进程的结构。过程由pid,burst和到达组成。我想通过到达排序队列,但我不知道从哪里开始。这是一些伪代码,以帮助说明我想说的内容:
struct Process{
int pid;
int burst;
int arrival;
};
void function(int numProcesses){
queue<Process> readyQueue;
// The following loop is a shortened version of my code
for(int i=0; i<numProcesses;i++){
readyQueue.push(aProcess);
}
// This is where I need help!
// sort(readyQueue);
}
我会感激任何能指出我如何做到这一点的人,或者如果有可能的话。谢谢!
答案 0 :(得分:4)
大多数情况下,您需要为您的班级定义operator<
:
struct Process{
int pid;
int burst;
int arrival;
bool operator<(Process const &other) { return arrival < other.arrival; }
};
完成后,std::sort
将正常运行:
std::sort(std::begin(readyQueue), std::end(readyQueue));
答案 1 :(得分:3)
您可以使用标题库中的标准库std::sort
进行排序。您可以提供比较器或定义较少的运算符。
struct Process{
int pid;
int burst;
int arrival;
};
bool operator<(const Process& a, const Process& b) {
return a.arrival < b.arrival;
}
void function(int numProcesses){
std::dequeue<Process> readyQueue;
// The following loop is a shortened version of my code
for(int i=0; i<numProcesses;i++){
readyQueue.push_back(aProcess);
}
std::sort(readyQueue.begin(), readyQueue.end());
}
答案 2 :(得分:0)
您应该使用std::priority_queue
代替...否则每次推送内容时都必须对队列进行排序。
请注意,您仍需要定义operator<
答案 3 :(得分:0)
您想要实现日历队列。不要使用queue
数据结构,而是使用set
:
struct Process{
int pid;
int burst;
int arrival;
bool operator<(Process const& other) const {
if (arrival == other.arrival) {
if (pid == other.pid)
return this < &other;
return pid < other.pid;
}
return arrival < other.arrival;
}
};
void func() {
std::set<Process> myQueue;
}
无需显式排序,该集将始终对内容进行排序,您始终可以通过erase
begin()
迭代器删除第一个内容。