对Deque中存储的类对象进行排序

时间:2011-12-19 12:09:33

标签: c++ visual-studio-2010 sorting deque

我正在尝试存储写在文件中的电子邮件地址,并按文件中的匹配对它们进行排序。

我将电子邮件地址和点击次数存储在名为emailAddress的类中。

我在另一个名为AddressManager的类中管理Deque中该类的成员。

我尝试使用的排序函数是算法库中的排序。 Like this.

[emailAddress.released() returns the number of hits. addressQueue is my emailAddress Deque]

bool AddressManager::swapTest(const emailAddress& address1, const emailAddress& address2)
{
    cout<<"Comparing: "<<address1.released()<<" to "<<address2.released()<<endl;
    return address1.released()>address2.released();
}
void AddressManager::sortAddresses()
{

    sort(addressQueue.begin(),addressQueue.end(),
        swapTest);
}

编译时我收到此错误:

1>c:\workspace\addressmanager.cpp(36): error C3867: 'AddressManager::swapTest': function call missing argument list; use '&AddressManager::swapTest' to create a pointer to member
1>c:\workspace\addressmanager.cpp(36): error C2780: 'void std::sort(_RanIt,_RanIt)' : expects 2 arguments - 3 provided
1>          c:\program files (x86)\microsoft visual studio 10.0\vc\include\algorithm(3639) : see declaration of 'std::sort'

我可以通过swapTest进行排序,还是需要以某种方式在AddressManager之外定义? 或者有人可以建议一种在AddressManager中实现我自己的排序的方法,而不是根本不使用库版本吗?

谢谢, 安克

2 个答案:

答案 0 :(得分:3)

只需定义一个

struct EmailSorter
{
  bool EmailSorter::operator ()(const emailAddress &a, const emailAddress &b) {
    return a.released()>b.released();
  }
};

EmailSorter es;

std::sort( v.begin() , v.end() , es );

并将其传递给std::sort

或者将 swapTest 设为静态函数并执行

std::sort( v.begin() , v.end() , &AddressManager::swapTest );

答案 1 :(得分:3)

使swapTest成为static函数,或使用lambda:

sort(addressQueue.begin(),addressQueue.end(),
     [](const emailAddress& address1, const emailAddress& address2)
       { return address1.released() > address2.released(); }
     );