Main.cpp的
#include <iostream>
#include <fstream>
#include <string>
#include <vector>
#include <fstream>
#include <algorithm>
#include <iomanip>
#include <sstream>
#include <queue>
#include<functional>
#include "procedure.h"
using namespace std;
int gcounter = 0;
//Comparator Classes
struct ComparebyJobTime{
bool operator()(Procedure lhs,Procedure rhs) {
return lhs.getTime() < rhs.getTime();
}
};
struct ComparebyProc{
bool operator()(Procedure lhs, Procedure rhs){
return lhs.getProc() < rhs.getProc();
}
};
typedef priority_queue<Procedure, vector<Procedure>, ComparebyProc> fcfs_q;
typedef priority_queue<Procedure, vector<Procedure>, ComparebyJobTime> sjf_q;
//Scheduling Algorithms
void FCFS(fcfs_q procs, int n, int m, int t_cs){
cout << "time " << gcounter << "ms: Simulator started for FCFS [Q ";
for(fcfs_q::iterator it = procs.begin(); it!= procs.end(), ++it{
if(it == (procs.end() - 1){
cout << *it.getProc() << "]" << endl;
}
else{
cout << *it.getProc() << " ";
}
}
}
void SJF(sfj_q procs, int n, int m, int t_cs){
cout << "time " << gcounter << "ms: Simulator started for SJF [Q ";
for(sjf_q::iterator it = procs.begin(); it != procs.end(); ++i{
if(it == (procs.end() - 1){
cout << *it.getProc() << "]" << endl;
}
else{
cout << *it.getProc() << " ";
}
}
}
//Main function
int main(int argc, char * argv[]) {
if (argc != 3){
cerr << "Usage: " << argv[0] << "processes-file\n";
}
ifstream in_file(argv[1]);
if(!in_file.good()){
cerr << "Can not open the input file " << argv[1] << "\n";
}
ofstream out_str(argv[2]);
if(!out_str){
cerr << "Could not open " << argv[2] << "to write\n";
}
string line;
fcfs_q pqf;
sjf_q pqs;
while(getline(in_file, line)){
istringstream iss(line);
char com;
iss >> com;
if(line.length() == 0 || com == '#'){
continue;
}
vector<string> split;
string token;
stringstream temp(line);
while(getline(temp, token, '|')){
split.push_back(token);
}
pqf.push(Procedure(atoi(split[0].c_str()),atoi(split[1].c_str()),atoi(split[2].c_str()),atoi(split[3].c_str())));
pqs.push(Procedure(atoi(split[0].c_str()),atoi(split[1].c_str()),atoi(split[2].c_str()),atoi(split[3].c_str())));
}
//Simulation Start
int n = pqf.size();
int m = 1; //Number of processors
int t_cs = 9; //Default context switch time
FCFS(pqf, n, m, t_cs);
cout << "time " << gcounter << "ms: Simulator ended for FCFS" << endl;
SJF(pqs, n, m, t_cs);
cout << "time " << gcounter << "ms: Simulator ended for SJF" << endl;
}
procedures.h
class Procedure{
public:
Procedure();
Procedure(int p, int bt, int num, int io){
procNum = p;
burst = bt;
numBurst = num;
ioTime = io;
}
int getProc(){return procNum;}
int getNum(){return numBurst;}
int getIO(){return ioTime;}
int getTime(){return burst;}
private:
int procNum;
int numBurst;
int ioTime;
int burst;
};
错误:
hello-cpp-world.cc: In function ‘void FCFS(fcfs_q, int, int, int)’:
hello-cpp-world.cc:39:9: error: ‘iterator’ is not a member of ‘fcfs_q {aka std::priority_queue<Procedure, std::vector<Procedure>, ComparebyProc>}’
for(fcfs_q::iterator it = procs.begin(); it!= procs.end(), ++it{
^
hello-cpp-world.cc:39:26: error: expected ‘;’ before ‘it’
for(fcfs_q::iterator it = procs.begin(); it!= procs.end(), ++it{
^
hello-cpp-world.cc:39:46: error: ‘it’ was not declared in this scope
for(fcfs_q::iterator it = procs.begin(); it!= procs.end(), ++it{
^
hello-cpp-world.cc:39:57: error: ‘fcfs_q’ has no member named ‘end’
for(fcfs_q::iterator it = procs.begin(); it!= procs.end(), ++it{
^
hello-cpp-world.cc:39:68: error: expected ‘;’ before ‘{’ token
for(fcfs_q::iterator it = procs.begin(); it!= procs.end(), ++it{
^
hello-cpp-world.cc:39:68: error: expected primary-expression before ‘{’ token
hello-cpp-world.cc:39:68: error: expected ‘)’ before ‘{’ token
hello-cpp-world.cc:40:25: error: ‘fcfs_q’ has no member named ‘end’
if(it == (procs.end() - 1){
^
hello-cpp-world.cc:40:35: error: expected ‘)’ before ‘{’ token
if(it == (procs.end() - 1){
^
hello-cpp-world.cc:46:5: error: expected primary-expression before ‘}’ token
}
^
hello-cpp-world.cc:46:5: error: expected ‘;’ before ‘}’ token
hello-cpp-world.cc: At global scope:
hello-cpp-world.cc:49:10: error: variable or field ‘SJF’ declared void
void SJF(sfj_q procs, int n, int m, int t_cs){
^
hello-cpp-world.cc:49:10: error: ‘sfj_q’ was not declared in this scope
hello-cpp-world.cc:49:23: error: expected primary-expression before ‘int’
void SJF(sfj_q procs, int n, int m, int t_cs){
^
hello-cpp-world.cc:49:30: error: expected primary-expression before ‘int’
void SJF(sfj_q procs, int n, int m, int t_cs){
^
hello-cpp-world.cc:49:37: error: expected primary-expression before ‘int’
void SJF(sfj_q procs, int n, int m, int t_cs){
^
使用上面的代码块和定义的procedure.h文件,我收到的错误是我的typedef迭代器不是有效的类。我无法弄清楚造成这种情况的原因是什么,任何人都可以在上面的代码中看到错误?
答案 0 :(得分:0)
std:queue
和std::priority_queue
都不可迭代,因此您未尝试调用的类型和方法未定义。您可以模拟队列上的迭代,如下图所示,但要注意:此操作将破坏队列。由于您按值而不是通过引用传递队列对象,原始的不会被销毁,只有副本,但复制本身可能需要一些时间。
void FCFS(fcfs_q procs, int n, int m, int t_cs){
cout << "time " << gcounter << "ms: Simulator started for FCFS [Q ";
while (!fcfs.empty()) {
const auto& elem = fcfs.top();
if(fcfs.size() == 1){ // the last element in the queue
cout << elem.getProc() << "]" << endl;
}
else{
cout << elem.getProc() << " ";
}
fcfs.pop();
}
}
有关详细信息,请参阅How to iterate over a priority_queue?和STL queue iteration。
另外,也许可以查看STL堆算法,例如make_heap()
中的push_heap()
,pop_heap()
,sort_heap()
和<algorithm>
。这些允许您明确地将项目存储为您选择的容器,保留其所有属性,例如,迭代它的能力,同时保持它的排序。