Solved

I want to use STL sort with a functor

Posted on 2000-05-10
8
216 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
Announcing the Most Valuable Experts of 2016

MVEs are more concerned with the satisfaction of those they help than with the considerable points they can earn. They are the types of people you feel privileged to call colleagues. Join us in honoring this amazing group of Experts.

 
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

Gigs: Get Your Project Delivered by an Expert

Select from freelancers specializing in everything from database administration to programming, who have proven themselves as experts in their field. Hire the best, collaborate easily, pay securely and get projects done right.

Question has a verified solution.

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

Suggested Solutions

What is C++ STL?: STL stands for Standard Template Library and is a part of standard C++ libraries. It contains many useful data structures (containers) and algorithms, which can spare you a lot of the time. Today we will look at the STL Vector. …
Container Orchestration platforms empower organizations to scale their apps at an exceptional rate. This is the reason numerous innovation-driven companies are moving apps to an appropriated datacenter wide platform that empowers them to scale at a …
The viewer will learn how to clear a vector as well as how to detect empty vectors in C++.
The viewer will be introduced to the technique of using vectors in C++. The video will cover how to define a vector, store values in the vector and retrieve data from the values stored in the vector.

813 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

Need Help in Real-Time?

Connect with top rated Experts

10 Experts available now in Live!

Get 1:1 Help Now