#include <algorithm>
#include <iostream>
class SIter {
public:
SIter(int* aIter, double* bIter) : aIter(aIter), bIter(bIter) {}
// we move to next position is just moving both:
SIter& operator ++() {
++aIter; ++bIter;
return *this;
}
SIter operator ++(int) {
SIter rv = *this;
++aIter; ++bIter;
return rv;
}
SIter& operator --() {
--aIter; --bIter;
return *this;
}
SIter operator --(int) {
SIter rv = *this;
--aIter; --bIter;
return rv;
}
SIter operator + (std::ptrdiff_t cc) const
{
SIter rv = *this;
rv.aIter += cc;
rv.bIter += cc;
return rv;
}
SIter operator - (std::ptrdiff_t cc) const
{
SIter rv = *this;
rv.aIter -= cc;
rv.bIter -= cc;
return rv;
}
std::ptrdiff_t operator - (SIter other) const
{
return aIter - other.aIter;
}
struct value_type {
int a; double b;
bool operator < (const value_type& other) const {
return a < other.a; // this is the place where way of sorting is defined!!!!
}
};
struct reference {
int* a;
double* b;
reference& operator = (const value_type& o)
{
*a = o.a;
*b = o.b;
return *this;
}
operator value_type() const {
value_type rv = { *a, *b };
return rv;
}
reference& operator = (const reference& other)
{
*a = *other.a;
*b = *other.b;
return *this;
}
bool operator < (const reference& other) const {
return *a < *other.a;
}
bool operator < (const value_type& other) const {
return *a < other.a;
}
};
reference operator * () {
reference rv = { aIter, bIter };
return rv;
}
bool operator == (const SIter& other) const
{
return aIter == other.aIter; // don't need to compare bIter - shall be in sync
}
bool operator != (const SIter& other) const
{
return aIter != other.aIter; // don't need to compare bIter - shall be in sync
}
bool operator < (const SIter& other) const
{
return aIter < other.aIter; // don't need to compare bIter - shall be in sync
}
// I bet you don't need pointer operator -> ()
typedef std::random_access_iterator_tag iterator_category;
typedef std::ptrdiff_t difference_type;
typedef reference pointer;
private:
int* aIter;
double* bIter;
};
int main() {
int a[10] = {10,9,8,7,6,5,4,3,2,1};
double b[10] = {1,2,3,4,5,6,7,8,9,10};
SIter beginIter(a, b);
SIter endIter(a + 10, b + 10);
std::sort(beginIter, endIter);
for (int i = 0; i < 10; ++i) {
std::cout << a[i] << "->" << b[i] << "\n";
}
}
I2luY2x1ZGUgPGFsZ29yaXRobT4KI2luY2x1ZGUgPGlvc3RyZWFtPgoKY2xhc3MgU0l0ZXIgewogICAgcHVibGljOgoKCiAgICAgICBTSXRlcihpbnQqIGFJdGVyLCBkb3VibGUqIGJJdGVyKSA6IGFJdGVyKGFJdGVyKSwgYkl0ZXIoYkl0ZXIpIHt9CiAgICAKICAgICAgLy8gd2UgbW92ZSB0byBuZXh0IHBvc2l0aW9uIGlzIGp1c3QgbW92aW5nIGJvdGg6CiAgICAgIFNJdGVyJiBvcGVyYXRvciArKygpIHsKICAgICAgICAgKythSXRlcjsgKytiSXRlcjsKICAgICAgICAgcmV0dXJuICp0aGlzOwogICAgICB9CiAgICAgIFNJdGVyIG9wZXJhdG9yICsrKGludCkgewogICAgICAgICBTSXRlciBydiA9ICp0aGlzOwogICAgICAgICArK2FJdGVyOyArK2JJdGVyOwogICAgICAgICByZXR1cm4gcnY7CiAgICAgIH0KICAgICAgU0l0ZXImIG9wZXJhdG9yIC0tKCkgewogICAgICAgICAtLWFJdGVyOyAtLWJJdGVyOwogICAgICAgICByZXR1cm4gKnRoaXM7CiAgICAgIH0KICAgICAgU0l0ZXIgb3BlcmF0b3IgLS0oaW50KSB7CiAgICAgICAgIFNJdGVyIHJ2ID0gKnRoaXM7CiAgICAgICAgIC0tYUl0ZXI7IC0tYkl0ZXI7CiAgICAgICAgIHJldHVybiBydjsKICAgICAgfQogICAgICBTSXRlciBvcGVyYXRvciArIChzdGQ6OnB0cmRpZmZfdCBjYykgY29uc3QKICAgICAgewogICAgICAgICAgU0l0ZXIgcnYgPSAqdGhpczsKICAgICAgICAgIHJ2LmFJdGVyICs9IGNjOwogICAgICAgICAgcnYuYkl0ZXIgKz0gY2M7CiAgICAgICAgICByZXR1cm4gcnY7CiAgICAgIH0KICAgICAgU0l0ZXIgb3BlcmF0b3IgLSAoc3RkOjpwdHJkaWZmX3QgY2MpIGNvbnN0CiAgICAgIHsKICAgICAgICAgIFNJdGVyIHJ2ID0gKnRoaXM7CiAgICAgICAgICBydi5hSXRlciAtPSBjYzsKICAgICAgICAgIHJ2LmJJdGVyIC09IGNjOwogICAgICAgICAgcmV0dXJuIHJ2OwogICAgICB9CiAgICAgIHN0ZDo6cHRyZGlmZl90IG9wZXJhdG9yIC0gKFNJdGVyIG90aGVyKSBjb25zdAogICAgICB7CiAgICAgICAgICByZXR1cm4gYUl0ZXIgLSBvdGhlci5hSXRlcjsKICAgICAgfQogICAgICAgc3RydWN0IHZhbHVlX3R5cGUgewogICAgICAgICAgaW50IGE7IGRvdWJsZSBiOwogICAgICAgICAgYm9vbCBvcGVyYXRvciA8IChjb25zdCB2YWx1ZV90eXBlJiBvdGhlcikgY29uc3QgewogICAgICAgICAgICAgIHJldHVybiBhIDwgb3RoZXIuYTsgLy8gdGhpcyBpcyB0aGUgcGxhY2Ugd2hlcmUgd2F5IG9mIHNvcnRpbmcgaXMgZGVmaW5lZCEhISEKICAgICAgICAgIH0KICAgICAgIH07CiAgICAgIHN0cnVjdCByZWZlcmVuY2UgewogICAgICAgICBpbnQqIGE7CiAgICAgICAgIGRvdWJsZSogYjsKICAgICAgICAgcmVmZXJlbmNlJiBvcGVyYXRvciA9IChjb25zdCB2YWx1ZV90eXBlJiBvKSAKICAgICAgICAgewogICAgICAgICAgICphID0gby5hOwogICAgICAgICAgICpiID0gby5iOwogICAgICAgICAgIHJldHVybiAqdGhpczsKICAgICAgICAgfQogICAgICAgICBvcGVyYXRvciB2YWx1ZV90eXBlKCkgY29uc3QgewogICAgICAgICAgICAgdmFsdWVfdHlwZSBydiA9IHsgKmEsICpiIH07CiAgICAgICAgICAgICByZXR1cm4gcnY7CiAgICAgICAgIH0KICAgICAgICAgcmVmZXJlbmNlJiBvcGVyYXRvciA9IChjb25zdCByZWZlcmVuY2UmIG90aGVyKQogICAgICAgICB7CiAgICAgICAgICAgICphID0gKm90aGVyLmE7CiAgICAgICAgICAgICpiID0gKm90aGVyLmI7CiAgICAgICAgICAgIHJldHVybiAqdGhpczsKICAgICAgICAgfQogICAgICAgICBib29sIG9wZXJhdG9yIDwgKGNvbnN0IHJlZmVyZW5jZSYgb3RoZXIpIGNvbnN0IHsKICAgICAgICAgICAgcmV0dXJuICphIDwgKm90aGVyLmE7IAogICAgICAgICB9CiAgICAgICAgIGJvb2wgb3BlcmF0b3IgPCAoY29uc3QgdmFsdWVfdHlwZSYgb3RoZXIpIGNvbnN0IHsKICAgICAgICAgICAgcmV0dXJuICphIDwgb3RoZXIuYTsgCiAgICAgICAgIH0KICAgICAgfTsKICAgICAgCiAgICAgIHJlZmVyZW5jZSBvcGVyYXRvciAqICgpIHsKICAgICAgICAgcmVmZXJlbmNlIHJ2ID0geyBhSXRlciwgYkl0ZXIgfTsKICAgICAgICAgcmV0dXJuIHJ2OwogICAgICB9CiAgICAgIGJvb2wgb3BlcmF0b3IgPT0gKGNvbnN0IFNJdGVyJiBvdGhlcikgY29uc3QKICAgICAgewogICAgICAgICAgcmV0dXJuIGFJdGVyID09IG90aGVyLmFJdGVyOyAvLyBkb24ndCBuZWVkIHRvIGNvbXBhcmUgYkl0ZXIgLSBzaGFsbCBiZSBpbiBzeW5jCiAgICAgIH0KICAgICAgYm9vbCBvcGVyYXRvciAhPSAoY29uc3QgU0l0ZXImIG90aGVyKSBjb25zdAogICAgICB7CiAgICAgICAgICByZXR1cm4gYUl0ZXIgIT0gb3RoZXIuYUl0ZXI7IC8vIGRvbid0IG5lZWQgdG8gY29tcGFyZSBiSXRlciAtIHNoYWxsIGJlIGluIHN5bmMKICAgICAgfQogICAgICBib29sIG9wZXJhdG9yIDwgKGNvbnN0IFNJdGVyJiBvdGhlcikgY29uc3QKICAgICAgewogICAgICAgICAgcmV0dXJuIGFJdGVyIDwgb3RoZXIuYUl0ZXI7IC8vIGRvbid0IG5lZWQgdG8gY29tcGFyZSBiSXRlciAtIHNoYWxsIGJlIGluIHN5bmMKICAgICAgfQogICAgICAvLyBJIGJldCB5b3UgZG9uJ3QgbmVlZCBwb2ludGVyIG9wZXJhdG9yIC0+ICgpCiAgICAgICB0eXBlZGVmIHN0ZDo6cmFuZG9tX2FjY2Vzc19pdGVyYXRvcl90YWcgaXRlcmF0b3JfY2F0ZWdvcnk7CiAgICAgICB0eXBlZGVmIHN0ZDo6cHRyZGlmZl90IGRpZmZlcmVuY2VfdHlwZTsKICAgICAgIHR5cGVkZWYgcmVmZXJlbmNlIHBvaW50ZXI7CiAKCiAgICBwcml2YXRlOgogICAgICBpbnQqIGFJdGVyOyAKICAgICAgZG91YmxlKiBiSXRlcjsKICAgIH07CgoKCgoKICAgIGludCBtYWluKCkgewogICAgICAgaW50IGFbMTBdID0gezEwLDksOCw3LDYsNSw0LDMsMiwxfTsKICAgICAgIGRvdWJsZSBiWzEwXSA9IHsxLDIsMyw0LDUsNiw3LDgsOSwxMH07CiAgICAgICAKICAgICAgIFNJdGVyIGJlZ2luSXRlcihhLCBiKTsKICAgICAgIFNJdGVyIGVuZEl0ZXIoYSArIDEwLCBiICsgMTApOwogICAgCiAgICAgICBzdGQ6OnNvcnQoYmVnaW5JdGVyLCBlbmRJdGVyKTsKICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMTA7ICsraSkgewogICAgICAgICAgIHN0ZDo6Y291dCA8PCBhW2ldIDw8ICItPiIgPDwgYltpXSA8PCAiXG4iOwogICAgICAgfQogICAgfQoK