排序结构队列

时间:2012-11-08 00:38:00

标签: c++ sorting queue

我目前有一个队列,其中包含用户指定数量的名为进程的结构。过程由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);
}

我会感激任何能指出我如何做到这一点的人,或者如果有可能的话。谢谢!

4 个答案:

答案 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());       
    }

http://en.cppreference.com/w/cpp/algorithm/sort

答案 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()迭代器删除第一个内容。