Solved

I want to use STL sort with a functor

Posted on 2000-05-10
8
217 Views
Last Modified: 2010-05-18
//
//  This compiles and runs if I comment out the
//  call to sort().
//  I would like to sort on key.  But, I have no clue
//  where to start on the syntax.
//
#include <vector>
#include <algorithm>
#include <iostream>
class keyPLUS {
  public:
     int key;
     int something_else;
} ;

int main() {

  vector<keyPLUS> KeyContainer(2);

  KeyContainer[0].key = 5;
  KeyContainer[0].something_else = 13;

  KeyContainer[1].key = 4;
  KeyContainer[1].something_else = 17;
 
  sort( &KeyContainer[0], &KeyContainer[2],
      what_do_I_put_here );
 
  cout << " [0].key =" << KeyContainer[0].key
       << " [0].something_else =" << KeyContainer[0].something_else << endl ;
  cout << " [1].key =" << KeyContainer[1].key
       << " [1].something_else =" << KeyContainer[1].something_else << endl ;
}

0
Comment
Question by:klopter
  • 4
  • 3
8 Comments
 

Expert Comment

by:fjfp
ID: 2798522
If you look at the prototype for the template function sort in <algorithm>, you'll see that it takes 2 iterators.  It expects the beginning and end of the vector (in this case).

Try:
sort(KeyContainer.begin(), KeyContainer.end());

Hope it helps.
Frank
0
 
LVL 9

Expert Comment

by:jasonclarke
ID: 2799367
> sort(KeyContainer.begin(), KeyContainer.end());

No, that will only work if you have a less than operator defined on the object, which you don't in this case.  You have a couple of options:

i) define a < operator

class keyPLUS {
  public:
     int key;
     int something_else;
     bool operator<(const keyPlus& rhs)
     { return key < rhs.key; // or whatever it should be }
} ;

and then the sort call given above will work (you could also define a non-member function less than operator).

or

ii) define a functor, as you asked originally, the best way is to use a function object:

class keyPlusLessThan
{
   bool operator()(const keyPlus& lhs, const keyPlus& rhs)
   { return lhs.key < rhs.key;  // ? }
};

then the sort call becomes:

sort(keyContainer.begin(), keyContainer.end(), keyPlusLessThan());

you can also do it with a pointer to a function if you want,  but the function object is probably better.  Let me know if you want to see an example with a function pointer.
0
 

Author Comment

by:klopter
ID: 2800157
Jason is right.  Sort( begin, end ) only works if you have defined operator <.

Ken
0
Free Tool: IP Lookup

Get more info about an IP address or domain name, such as organization, abuse contacts and geolocation.

One of a set of tools we are providing to everyone as a way of saying thank you for being a part of the community.

 
LVL 9

Expert Comment

by:jasonclarke
ID: 2800247
so, is my answer good enough?

or do you need more/different help?
0
 
LVL 9

Accepted Solution

by:
jasonclarke earned 150 total points
ID: 2803669
assuming my comment above is sufficient.
0
 

Author Comment

by:klopter
ID: 2804675
Jason,
  I meant to accept your answer.  My excuse is that there was a bit of a delay in getting my rejection accepted (busy network I guess) and then I forgot.

Thanks,
  Ken
0
 
LVL 9

Expert Comment

by:jasonclarke
ID: 2804688
No problem, It's sometimes difficult to know what to do around here.  Sometimes completely inappropriate answers get accepted, just because they are answers  and somebody else has added the answer in a comment.

So it seems better to get an answer in if you think it is appropriate...
0
 

Author Comment

by:klopter
ID: 2805530
Makes sense to me.
0

Featured Post

Free Tool: Site Down Detector

Helpful to verify reports of your own downtime, or to double check a downed website you are trying to access.

One of a set of tools we are providing to everyone as a way of saying thank you for being a part of the community.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

When writing generic code, using template meta-programming techniques, it is sometimes useful to know if a type is convertible to another type. A good example of when this might be is if you are writing diagnostic instrumentation for code to generat…
Introduction This article is a continuation of the C/C++ Visual Studio Express debugger series. Part 1 provided a quick start guide in using the debugger. Part 2 focused on additional topics in breakpoints. As your assignments become a little more …
The viewer will learn how to use the return statement in functions in C++. The video will also teach the user how to pass data to a function and have the function return data back for further processing.
The viewer will be introduced to the member functions push_back and pop_back of the vector class. The video will teach the difference between the two as well as how to use each one along with its functionality.

821 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question