c++ - 在 std :sort() 上使用类

标签 c++ class sorting vector struct

这里的一个例子: http://www.cplusplus.com/reference/algorithm/sort/

表示

struct myclass {
  bool operator() (int i,int j) { return (i<j);}
} myobject;

int main () {
  int myints[] = {32,71,12,45,26,80,53,33};
  std::vector<int> myvector (myints, myints+8);               // 32 71 12 45 26 80 53 33

  // using object as comp
  std::sort (myvector.begin(), myvector.end(), myobject);     //(12 26 32 33 45 53 71 80)
}

这很好用,但是我正在尝试使用类而不是结构。所以我正在做的是:

CardComparer 类:

bool CardComparer::operator() (Card* firstCard, Card* secondCard) {
    this->firstCard = firstCard;
    this->secondCard = secondCard;
    if (firstCard->GetRank() == secondCard->GetRank()) {
        return firstCard->GetSuit() > secondCard->GetSuit();
    }
    else {
        return firstCard->GetRank() > secondCard->GetRank();
    }
}

这是主要的:

CardComparer* compare;
compare = new CardComparer();
sort(cards.begin(), cards.end(), compare->operator());

我收到这么长的错误:

hand.cpp: In member function 'void Hand::AddCard(Card*)':
hand.cpp:60:54: error: no matching function for call to 'sort(std::vector<Card*>::iterator, std::vector<Card*>::iterator, <unresolved overloaded function type>)'
hand.cpp:60:54: note: candidates are:
In file included from /usr/include/c++/4.7/algorithm:63:0,
                 from hand.cpp:4:
/usr/include/c++/4.7/bits/stl_algo.h:5463:5: note: template<class _RAIter> void std::sort(_RAIter, _RAIter)
/usr/include/c++/4.7/bits/stl_algo.h:5463:5: note:   template argument deduction/substitution failed:
hand.cpp:60:54: note:   candidate expects 2 arguments, 3 provided
In file included from /usr/include/c++/4.7/algorithm:63:0,
                 from hand.cpp:4:
/usr/include/c++/4.7/bits/stl_algo.h:5499:5: note: void std::sort(_RAIter, _RAIter, _Compare) [with _RAIter = __gnu_cxx::__normal_iterator<Card**, std::vector<Card*> >; _Compare = bool (CardComparer::*)(Card*, Card*)]
/usr/include/c++/4.7/bits/stl_algo.h:5499:5: note:   no known conversion for argument 3 from '<unresolved overloaded function type>' to 'bool (CardComparer::*)(Card*, Card*)'

我找不到真正的解决方案,因为如果我修改示例并将其保留为结构,它可以正常工作,但当我将它转换为类时却不起作用。

最佳答案

第三个参数称为仿函数,是可以调用的东西。指向函数的指针、C++11 lambda 或具有 operator() 成员函数的对象实例(不是指针)。

在您的情况下,不要在堆上动态分配仿函数对象,在 std::sort 调用中将其声明为临时对象就足够了:

std::sort(cards.begin(), cards.end(), CardComparer());

在上面的std::sort调用中,使用CardComparer()在栈上创建一个对象,这个对象是临时的,并且只是在 std::sort 运行时有效。 std::sort 函数将调用此对象,这与调用对象上的 operator() 函数相同。

由于这个比较仿函数非常简单,它不需要存储任何数据:

struct CardComparer
{
    bool operator() (const Card* firstCard, const Card* secondCard) const { ... }
};

因此不需要成员数据字段。

关于c++ - 在 std :sort() 上使用类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16181859/

相关文章:

c++ - C++ 中弃用的强制转换

c++ - 设置小数点前数字的精度?

c++ - 类成员函数作为函数指针

java - 如何从另一个类访问静态变量?

c++ - 基于另一个模板对象创建模板对象

c++ - 什么是 "Argument-Dependent Lookup"(又名 ADL,或 "Koenig Lookup")?

Java : static keyword in middle of class

c# - 按多列对 C# 中的锯齿状数组进行排序

sorting - ASPxGridView 分组汇总排序 - 对里面的内容进行排序,而不是对外面的汇总进行排序

wpf - 按字母顺序对列表框中的项目进行分组