Recker
Recker

Reputation: 1973

C++ std:sort() using different criteria

I searched a lot and I am not sure if this is query is repeated but I used this as an reference to create a sort for my std::vector which takes data of following type.

typedef struct {
    int size;
    int type;
    int id;
} AC; 

I was able to write individual function objects for each criteria. However, my project requirement says that I need to have only once class or struct to include all the function objects for sorting according to size,type and id. Is it possible to have all the function objects for std::sort in one class?

I mean something like

Comparator com;
sort(iVec.begin(),iVec.end(),com.sortbysize);
sort(iVec.begin(),iVec.end(),com.sortbytype);
sort(iVec.begin(),iVec.end(),com.sortbyid);

I also looked at binary_functions to fulfill my requirement but I was getting errors, when I declared more than one function object in a single class.

Further, is it necessary that function objects for std::sort (and for that matter any STL algorithm which involves comparison) need to be bool operator() or they can be normal functions returning bool?

Upvotes: 0

Views: 1968

Answers (2)

dunadar
dunadar

Reputation: 1785

Yes, if you want to have a class, you can define static functions on it:

class MyComparator {
    public:
        static bool sortbysize( const AC & elem1, const AC & elem2 ){ ... }
        static bool sortbytype( const AC & elem1, const AC & elem2 ){ ... }
        static bool sortbyid  ( const AC & elem1, const AC & elem2 ){ ... }
}

And then using sort using the appropriate syntax for invoking static functions:

sort(iVec.begin(),iVec.end(),MyComparator::sortbysize);

If you really prefer to follow a regular comparable class style, you can do (although appears to be a bit stupid) things like using a static marker inside the class that specifies how the comparison operator will work:

typedef struct {
    int size;
    int type;
    int id;

    enum marker { SIZE, TYPE, ID };
    static AC::marker comparisonType;

    bool operator() (const AC & i,const AC & j) 
    { 
        // Work here to make the enum thing work with the switch-case... 
        // it's all about integers
        switch(AC::comparisonType){
        case SIZE:
            return (i.size < j.size);
        ...
        }
    }
} AC; 

Upvotes: 1

MSN
MSN

Reputation: 54594

Yes to both:

struct Comparator
{
    static bool sortbysize(const AC &lhs, const AC &rhs) { /*...*/ }
    static bool sortbytype(const AC &lhs, const AC &rhs) { /*...*/ }
    static bool sortbyid(const AC &lhs, const AC &rhs) { /*...*/ }
}

Upvotes: 4

Related Questions