Picked up this question from here and made a program out of it. It may be a good idea to quickly brush functors and templates if required.
The program sorts the input Vector provided regardless of the type.
//Program tested on Microsoft Visual Studio 2008 - Zahid Ghadialy
#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
using namespace std;
class Int
{
public:
Int() {x_ = 0;}
Int(const int &x) {x_ = x;}
int getID (void) {return x_;}
int x_;
};
class Str
{
public:
Str() {x_ = "";}
Str(const string &x) {x_ = x;}
string getID (void) {return x_;}
string x_;
};
template <typename Object> class Comparator {
public:
bool operator()(const Object &o1, const Object &o2) const
{
return (const_cast<Object&>(o1).getID() < const_cast<Object&>(o2).getID());
}
bool operator()(const Object *o1, const Object *o2) const {
return (o1->getID() < o2->getID());
}
};
template <typename VecObject> void Display(VecObject v)
{
VecObject::iterator it;
for(it = v.begin(); it != v.end(); ++it)
{
cout<<it->getID()<<", ";
}
cout<<endl;
}
int main()
{
vector<Int> objects1;
objects1.push_back(Int(3));
objects1.push_back(Int());
objects1.push_back(Int(77));
//print the output
cout<<"objects1 before sort = ";
Display(objects1);
std::sort(objects1.begin(), objects1.end(), Comparator<Int> ());
cout<<"objects1 after sort = ";
Display(objects1);
std::vector<Str> objects2;
objects2.push_back(Str("Hello Hello"));
objects2.push_back(Str("apple?"));
objects2.push_back(Str());
objects2.push_back(Str("1 Jump"));
//print the output
cout<<"objects2 before sort = ";
Display(objects2);
std::sort(objects2.begin(), objects2.end(), Comparator<Str> ());
cout<<"objects2 after sort = ";
Display(objects2);
return 0;
}
The output is as follows:
I was curious about why the objects2 array was sorted this way (Hello comes before apple), and it's because the comparison for string uses the ASCII character codes, and capital letters come before lowercase letters in ASCII.
ReplyDelete