Rob
Rob

Reputation: 171

Sort a vector of struct based on a specific field

Currently I am trying to sort a vector of structs based on a specific field. I have set up a custom comparison function for the use of the sort function. However, i am getting some errors with it.

Code:

    struct Play{
      int min, down, yard, locat;
      string Description, offname, defname;
      double relevance;
     };

    bool customCompare(const Play &x, const Play &y)
    {
        return (x.relevance < y.relevance);
    }

    void printResults()
    {
        sort(vecData.begin(),vecData.end(), customCompare);
    }`

Errors:

    error C3867: 'List::customCompare': function call missing argument list; use '&List::customCompare' to create a pointer to member
    error C2780: 'void std::sort(_RanIt,_RanIt)' : expects 2 arguments - 3 provided

Upvotes: 6

Views: 3868

Answers (3)

L. F.
L. F.

Reputation: 20579

Although this is an old question, I would like to note for the benefit of the future readers the possibility of directly sorting according to a specific field with the help of projections in the upcoming Ranges library in C++20:

ranges::sort(vecData, ranges::less, &Play::relevance);

This avoids the need of specifying two iterators or writing a custom comparison function or lambda.

Upvotes: 5

shivakumar
shivakumar

Reputation: 3397

a) Use sort function with lambda notation as below( if you are using c++11)

 sort(vecData.begin(),vecData.end(), [](const Play &x, const Play &y){ return (x.relevance < y.relevance);});

Working code:

http://ideone.com/bDOrBV

b) Make comparator function as static

http://ideone.com/0HsaaH

Upvotes: 5

lennon310
lennon310

Reputation: 12689

static bool customCompare(const Play &x, const Play &y)

Upvotes: 2

Related Questions