1

我不知道如何正确实现 C++ 中列表的排序。我收到构建错误:

'Ranker::compare':函数调用缺少参数列表;用于'&Ranker::compare'创建指向成员的指针

如何正确实现列表的排序功能?

Ranker.h:

list<Competitor*> sorted;

Ranker.cpp:

bool Ranker::compare(Competitor* first, Competitor* second) {
    if (first->getTime() < second->getTime())
        return true;
    else
        return false;
}

int Ranker::addList(Competitor* starter) {
    sorted.push_back(starter);
    sorted.sort(compare);
}
4

3 回答 3

7

只需让 rankor 成为一个简单的函子:

struct Compare
{
    bool operator()(Competitor* first, Competitor* second) const {
        return first->getTime() < second->getTime();
    }
};

// STUFF
sorted.sort(Compare());

或者如果你有 C++11

sorted.sort([](Competitor* first, Competitor* second) {
          return first->getTime() < second->getTime();
           });
于 2013-11-05T23:25:51.017 回答
5

Ranker::compare()是成员函数。成员函数与实例相关联。尝试使用静态方法或“免费”功能。

于 2013-11-05T23:25:42.530 回答
0

该函数Ranker::compare()实际上有三个参数:除了两个Competitor对象之外,它还接受一个指向该对象的隐式指针作为参数。但是,传递的二元谓词 dostd::list<...>::sort()只需要两个参数。

最简单的解决方法可能是使该函数成为static成员。然而,这并不是最快的方法,因为函数指针很少可以内联。如果您想减少函数调用开销,您可能希望将逻辑封装到一个合适的函数对象中:

struct RankerCompare {
    bool operator()(Competitor const* first, Competitor const* second) const {
        return first->getTime() < second->getTime();
    }
};
...
sorted.sort(RankerCompare());

顺便说一句,布尔值不会通过返回truefalse从条件语句变得更加布尔值!直接返回一个布尔值是完全可以的!

于 2013-11-05T23:29:34.110 回答