如何使用list::sort()对STL列表对象进行排序,同时将自定义排序函数作为参数传递给list::排序

How do I sort an STL list object using list::sort() while passing my custom sorting function as a parameter to list::sort?

本文关键字:排序 list 自定义 参数传递 函数 sort 何使用 STL 对象 列表      更新时间:2023-10-16

以下是我所指的策略和库调用:http://www.cplusplus.com/reference/list/list/sort/

下面是我的代码摘录(注意objFromList.getPriority()返回一个整数值):

标题:

class JobTable
{
    private:
        list <ProcessControlBlock> jobTable;
        list<ProcessControlBlock>::iterator iter;
    public:
        JobTable();
        void addProcessControlBlock(int, int, int, int, int);
        void sortJobTableByPriority();
        void printJobTable();
        bool comparePriority( ProcessControlBlock&,
                             ProcessControlBlock&);
};

实现:

void JobTable::addProcessControlBlock(int jobNumber, int jobSize, 
                                     int currentTime, int jobPriority, 
                                     int maximumCpuTime)
{
    jobTable.push_back(*(new ProcessControlBlock(jobNumber,jobSize,
                      currentTime, jobPriority,maximumCpuTime)));
}
void JobTable::sortJobTableByPriority()
{
    jobTable.sort(comparePriority);
}
bool JobTable::comparePriority( ProcessControlBlock& first,  
                              ProcessControlBlock& second)
{
    bool isLessThan = false;
    if(first.getJobPriority() < second.getJobPriority())
    {
        isLessThan = true;
    }
    return isLessThan;
}

main:

int main()
{
    JobTable jobTable;
    jobTable.addProcessControlBlock(6,6,6,6,6);
    jobTable.addProcessControlBlock(2,2,2,2,2);
    jobTable.addProcessControlBlock(1,1,1,1,1);
    jobTable.addProcessControlBlock(4,4,4,4,4);
    jobTable.addProcessControlBlock(5,5,5,5,5);
    jobTable.addProcessControlBlock(3,3,3,3,3);
    jobTable.printJobTable();
    cout << "sorting table..." << endl;
    jobTable.sortJobTableByPriority();
    jobTable.printJobTable();
    return 0;
}

我不断得到编译器错误:

对的调用没有匹配函数

std::list<ProcessControlBlock>::sort(<unresolved overloaded function type>)

尖括号表示这些家伙"<>",由于某种原因,它无法打印到网页上。

谢谢你的帮助。

我认为它需要是一个自由函数,或者声明它为静态static bool comparePriority( const ProcessControlBlock&, const ProcessControlBlock&);。另一种选择是将其封装在一个结构中,这样它就可以用作函子(如评论中发布的链接所述)

由于您的代码还有许多其他编译错误,我发现很难为您编写一个示例。

bool comparePriority( const ProcessControlBlock& first,  
                              const ProcessControlBlock& second)
{
    bool isLessThan = false;
    if(first.getJobPriority() < second.getJobPriority())
    {
        isLessThan = true;
    }
    return isLessThan;
}
void JobTable::sortJobTableByPriority()
{
    jobTable.sort(comparePriority);
}

首先,查看文章顶部给定链接中的第二个重载列表::sort。上面写着,

template <class Compare> void sort (Compare comp);

这意味着它采用某种类型的对象(在本例中称为Compare)作为参数。

重要的是,该类型应能够充当比较器

因此,您需要首先将JobTable::comparePriority作为一个类。它应该实现一个二进制谓词,其形式为:

bool operator()(const ProcessControlBlock& first,  const ProcessControlBlock& second) const { 
    // your logic  
    return true; 
}

然后,您应该将这个类的一个实例作为list::sort()的参数传递,就像一样

yourList.sort(Compare());

如果您像下面这样写,它将产生编译错误,因为参数应该是对象,而不是类型。

yourLIst.sort(Compare);