3

I am trying to sort a vector of nodes. I followed the advice from this thread and overloaded my
struct's < operator. However I am not getting a sorted list after sort is called.

struct node
{

    int frequency ;
    char data;

    bool operator < (const node& n1) const
    {
        return (frequency < n1.frequency);
    }
};

I call sort by the following:

vector<node*> test
//fill test with nodes
sort(test.begin(),test.end());

Output:

Presort data is: 1,1,2,3,3,1,2,1,1
Postsort data is: 3,2,1,1,1,1,2,1,3
Matt
  • 33
  • 6

2 Answers2

6

Since you are sorting a vector of pointers, but the operator applies to a struct, C++ ignores your operator < overload.

You can supply a custom comparer that calls your operator <, like this

std::sort(test.begin(), test.end(), [](const node* pa, const node* pb) {
    return (*pb) < (*pa);
});

or code the comparison straight into the lambda, and drop the unused overload of <, like this:

std::sort(test.begin(), test.end(), [](const node* pa, const node* pb) {
    return pb->frequency < pa->frequency;
});
Sergey Kalinichenko
  • 714,442
  • 84
  • 1,110
  • 1,523
0

Easiest way to do this is to use lambdas:

sort(test.begin(),test.end(), [](const node &lhs, const node &rhs){return lhs->frequency < rhs->frequency;});
doug
  • 3,840
  • 1
  • 14
  • 18
  • 2
    You need to change &lhs and &rhs to *lhs and *rhs. By doing those changes, I was able to get this to work immediately – Matt Oct 24 '15 at 05:18