std :: sort没有仿函数

时间:2009-06-01 07:45:47

标签: c++ stl sorting functor

我对std :: sort算法有疑问。这是我的测试代码:

struct MyTest
{
    int m_first;
    int m_second;

    MyTest(int first = 0, int second = 0) : m_first(first), m_second(second)
    {
    }
};


int main(int argc,char *argv[])
{
    std::vector<MyTest> myVec;
    for(int i = 0; i < 10; ++i)
    {
        myVec.push_back(MyTest(i, i + 1));
    }


    //Sort the vector in descending order on m_first without using stand alone function or functors


    return 0;

}  

是否可以在不使用任何独立函数或仿函数的情况下对变量m_first上的向量进行排序?另外,请注意我没有使用提升。

6 个答案:

答案 0 :(得分:10)

是的,只要要排序的范围中的值类型具有定义“严格弱排序”的operator <,也就是说,它可用于比较两个MyTest实例正确。您可以执行以下操作:

class MyTest
{
  ...
  bool operator <(const MyTest &rhs) const
  {
    return m_first<rhs.m_first;
  }
};

答案 1 :(得分:3)

写一个运算符&lt;为你的结构。这是sort使用的默认函数,也是允许它在自定义数据结构上运行的最简单方法。

答案 2 :(得分:2)

定义运算符&lt;

struct MyTest
{
...
    bool operator<(const MyTest& a_test) const {
        return m_first < a_test.m_first;
    }
};

答案 3 :(得分:2)

可以使用成员函数来完成它,但是独立功能是可行的方法。

bool operator <(const MyTest &lhs, const MyTest &rhs)
{
    return lhs.m_first<rhs.m_first;
}

为什么......

  

Scott Meyers:非会员职能如何改善封装

     

如果您正在编写可以执行的功能   实施为成员或   作为非朋友的非会员,你应该   更愿意将其作为非成员实施   功能。那个决定增加了   类封装。你想的时候   封装,你应该想   非会员职能。

     

Surprised? Read on

答案 4 :(得分:1)

您应该在operator<中定义MyTest,它应该如下所示:

bool operator<(const MyTest &other) const {
  return m_first < other.m_first;
};

答案 5 :(得分:-2)

http://ideone.com/3QLtP

这不定义运算符&lt;,但定义了functor。

然而,穿越时间或编译过程很有趣。