Solved

I want to use STL sort with a functor

Posted on 2000-05-10
8
214 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
 
LVL 9

Expert Comment

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

or do you need more/different help?
0
Free Trending Threat Insights Every Day

Enhance your security with threat intelligence from the web. Get trending threat insights on hackers, exploits, and suspicious IP addresses delivered to your inbox with our free Cyber Daily.

 
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

Find Ransomware Secrets With All-Source Analysis

Ransomware has become a major concern for organizations; its prevalence has grown due to past successes achieved by threat actors. While each ransomware variant is different, we’ve seen some common tactics and trends used among the authors of the malware.

Join & Write a Comment

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…
This article will show you some of the more useful Standard Template Library (STL) algorithms through the use of working examples.  You will learn about how these algorithms fit into the STL architecture, how they work with STL containers, and why t…
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.

744 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