1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141
|
#include <vector>
#include <algorithm>
#include <iostream>
#include <fstream>
#include <string>
#include <iterator>
//SORTWITH
template <typename Type>
class SortWith
{
bool (Type::*d_ptr)(Type const &rhv) const;
//=
public:
SortWith(bool (Type::*ptr)(Type const &rhv) const);
bool operator()(Type const &lhv, Type const &rhv) const;
};
//SORTCONS
template <typename Type>
SortWith<Type>::SortWith(bool (Type::*ptr)(Type const &rhv) const)
:
d_ptr(ptr)
{}
//=
//OPERATOR
template <typename Type>
bool SortWith<Type>::operator()(Type const &lhv, Type const &rhv) const
{
return (lhv.*d_ptr)(rhv);
}
//=
//HEAD
template <typename Type>
class SortVector: public std::vector<Type>
{
public:
SortVector()
{}
SortVector(Type const *begin, Type const *end)
:
std::vector<Type>(begin, end)
{}
//=
void hierarchicSort
(
bool (Type::**arr)(Type const &rhv) const,
size_t n
);
};
//SORT
template <typename Type>
void SortVector<Type>::hierarchicSort(
bool (Type::**arr)(Type const &rhv) const,
size_t n)
{
while (n--)
stable_sort(this->begin(), this->end(), SortWith<Type>(arr[n]));
}
//=
class MultiData;
namespace std
{
ostream &operator<<(ostream &str, MultiData const &obj);
istream &operator>>(istream &str, MultiData &obj);
}
class MultiData
{
friend std::ostream
&std::operator<<(std::ostream &str, MultiData const &obj);
friend std::istream
&std::operator>>(std::istream &str, MultiData &obj);
std::string d_text;
int d_value;
public:
bool textCmp(MultiData const &rhv) const
{
return d_text < rhv.d_text;
}
bool intCmp(MultiData const &rhv) const
{
return d_value < rhv.d_value;
}
};
namespace std
{
ostream &operator<<(ostream &output, MultiData const &obj)
{
return output << obj.d_text << " " << obj.d_value;
}
istream &operator>>(istream &input, MultiData &obj)
{
return input >> obj.d_text >> obj.d_value;
}
}
using namespace std;
int main()
{
//MAIN1
SortVector<MultiData> sv;
copy(istream_iterator<MultiData>(cin),
istream_iterator<MultiData>(),
back_inserter(sv));
//=
copy(sv.begin(), sv.end(),
ostream_iterator<MultiData>(cout, " "));
cout << "\n====\n";
//ARRAY
bool (MultiData::*arr[])(MultiData const &rhv) const =
{
&MultiData::textCmp,
&MultiData::intCmp,
};
//=
//SORT1
sv.hierarchicSort(arr, 2);
//=
copy(sv.begin(), sv.end(),
ostream_iterator<MultiData>(cout, " "));
cout << "\n====\n";
//SORT2
swap(arr[0], arr[1]);
sv.hierarchicSort(arr, 2);
//=
copy(sv.begin(), sv.end(),
ostream_iterator<MultiData>(cout, " "));
cout << "\n====\n";
}
|