#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
class someType {
public:
someType() = default;
~someType() = default;
virtual void print(ostream&) {}
friend ostream& operator << (ostream &os, someType *&value);
virtual double getData() {};
};
ostream& operator << (ostream &os, someType *&value){
value->print(os);
return os;
}
class doubleType : public someType {
private:
double data;
public:
doubleType(double data) : someType() {
this->data = data;
}
void print(ostream& os){
os << data;
}
double getData(){
return data;
}
};
class intType : public someType {
private:
int data;
public:
intType(int data) : someType() {
this->data = data;
}
void print(ostream& os){
os << data;
}
double getData(){
return data;
}
};
class charType : public someType {
private:
char data;
public:
charType(char data) : someType() {
this->data = data;
}
void print(ostream& os){
os << data;
}
double getData(){
return data;
}
};
int main(){
vector<someType*> el;
el.push_back(new charType('z'));
el.push_back(new intType(10));
el.push_back(new doubleType(10.01));
el.push_back(new charType('c'));
for_each(el.begin(), el.end(), [](someType* value) -> void {
cout << value << endl;
});
sort(el.begin(), el.end(), [] (someType* first, someType* second) -> bool {
return first->getData() < second->getData();
});
cout << endl;
for_each(el.begin(), el.end(), [](someType* value) -> void {
cout << value << endl;
});
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgojaW5jbHVkZSA8YWxnb3JpdGhtPgoKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCmNsYXNzIHNvbWVUeXBlIHsKcHVibGljOgogICAgc29tZVR5cGUoKSA9IGRlZmF1bHQ7CiAgICB+c29tZVR5cGUoKSA9IGRlZmF1bHQ7CiAgICB2aXJ0dWFsIHZvaWQgcHJpbnQob3N0cmVhbSYpIHt9CiAgICBmcmllbmQgb3N0cmVhbSYgb3BlcmF0b3IgPDwgKG9zdHJlYW0gJm9zLCBzb21lVHlwZSAqJnZhbHVlKTsKICAgIHZpcnR1YWwgZG91YmxlIGdldERhdGEoKSB7fTsKfTsKCm9zdHJlYW0mIG9wZXJhdG9yIDw8IChvc3RyZWFtICZvcywgc29tZVR5cGUgKiZ2YWx1ZSl7CiAgICB2YWx1ZS0+cHJpbnQob3MpOwogICAgcmV0dXJuIG9zOwp9CgpjbGFzcyBkb3VibGVUeXBlIDogcHVibGljIHNvbWVUeXBlIHsKcHJpdmF0ZToKICAgIGRvdWJsZSBkYXRhOwpwdWJsaWM6CiAgICBkb3VibGVUeXBlKGRvdWJsZSBkYXRhKSA6IHNvbWVUeXBlKCkgewogICAgICAgIHRoaXMtPmRhdGEgPSBkYXRhOwogICAgfQogICAgdm9pZCBwcmludChvc3RyZWFtJiBvcyl7CiAgICAgICAgb3MgPDwgZGF0YTsKICAgIH0KICAgIGRvdWJsZSBnZXREYXRhKCl7CiAgICAgICAgcmV0dXJuIGRhdGE7CiAgICB9Cn07CgoKY2xhc3MgaW50VHlwZSA6IHB1YmxpYyBzb21lVHlwZSB7CnByaXZhdGU6CiAgICBpbnQgZGF0YTsKcHVibGljOgogICAgaW50VHlwZShpbnQgZGF0YSkgOiBzb21lVHlwZSgpIHsKICAgICAgICB0aGlzLT5kYXRhID0gZGF0YTsKICAgIH0KICAgIHZvaWQgcHJpbnQob3N0cmVhbSYgb3MpewogICAgICAgIG9zIDw8IGRhdGE7CiAgICB9CiAgICBkb3VibGUgZ2V0RGF0YSgpewogICAgICAgIHJldHVybiBkYXRhOwogICAgfQp9OwoKY2xhc3MgY2hhclR5cGUgOiBwdWJsaWMgc29tZVR5cGUgewpwcml2YXRlOgogICAgY2hhciBkYXRhOwpwdWJsaWM6CiAgICBjaGFyVHlwZShjaGFyIGRhdGEpIDogc29tZVR5cGUoKSB7CiAgICAgICAgdGhpcy0+ZGF0YSA9IGRhdGE7CiAgICB9CiAgICB2b2lkIHByaW50KG9zdHJlYW0mIG9zKXsKICAgICAgICBvcyA8PCBkYXRhOwogICAgfQogICAgZG91YmxlIGdldERhdGEoKXsKICAgICAgICByZXR1cm4gZGF0YTsKICAgIH0KfTsKCgoKaW50IG1haW4oKXsKICAgIHZlY3Rvcjxzb21lVHlwZSo+IGVsOwogICAgZWwucHVzaF9iYWNrKG5ldyBjaGFyVHlwZSgneicpKTsKICAgIGVsLnB1c2hfYmFjayhuZXcgaW50VHlwZSgxMCkpOwogICAgZWwucHVzaF9iYWNrKG5ldyBkb3VibGVUeXBlKDEwLjAxKSk7CiAgICBlbC5wdXNoX2JhY2sobmV3IGNoYXJUeXBlKCdjJykpOwoKCiAgICBmb3JfZWFjaChlbC5iZWdpbigpLCBlbC5lbmQoKSwgW10oc29tZVR5cGUqIHZhbHVlKSAtPiB2b2lkIHsKICAgICAgICBjb3V0IDw8IHZhbHVlIDw8IGVuZGw7CiAgICB9KTsKCiAgICBzb3J0KGVsLmJlZ2luKCksIGVsLmVuZCgpLCBbXSAoc29tZVR5cGUqIGZpcnN0LCBzb21lVHlwZSogc2Vjb25kKSAtPiBib29sIHsKICAgICAgICByZXR1cm4gZmlyc3QtPmdldERhdGEoKSA8IHNlY29uZC0+Z2V0RGF0YSgpOwogICAgfSk7Cgljb3V0IDw8IGVuZGw7CiAgICBmb3JfZWFjaChlbC5iZWdpbigpLCBlbC5lbmQoKSwgW10oc29tZVR5cGUqIHZhbHVlKSAtPiB2b2lkIHsKICAgICAgICBjb3V0IDw8IHZhbHVlIDw8IGVuZGw7CiAgICB9KTsKfQo=