Re: Sorting two arrays with one call to sort()?
I think all the comp.lang.c++.moderated replies
were BS! I wasted time on each one of them and it was
a total waste of time...! None of those suggestions
work...the zip iterator was not designed to do what I
want to do...(well I'm glad I learnt about its useless
existence for my problem) and the other solution is
not that trivial...as it looks...beware...
I compiled and run this using VS2003:
#include <iostream>
#include <algorithm>
#include <assert.h>
using namespace std;
const int N = 10;
template < typename tA, typename tB >
struct double_iterator {
typedef double_iterator<tA,tB> self;
tA* a;
tB* b;
int idx;
double_iterator(tA* _a, tB* _b, int idx = 0) : idx(idx) {
a = _a ;
b = _b ;
};
struct value_type {
tA a; tB b;
tA *pa; tB *pb;
value_type(tA *pa, tB *pb) : pa(pa), pb(pb), a(*pa),
b(*pb) {};
void operator=(value_type other){
*pa = other.a; *pb = other.b;
};
bool operator<(value_type other){
return a < other.a ;
};
};
typedef std::random_access_iterator_tag iterator_category;
typedef int difference_type;
typedef int distance_type;
typedef value_type& reference;
typedef value_type* pointer;
value_type operator*(){ return value_type(a+idx,b+idx); }
bool operator<(const self & other) const {
assert( a == other.a && b == other.b );
return idx < other.idx;
}
bool operator==(const self & other) const {
return a == other.a && b == other.b && idx == other.idx;
}
bool operator!=(const self & other) const {
return !(*this == other);
}
int operator-(const self & other) {
return idx - other.idx;
}
self operator-(int to_del) const {
self ret = *this;
ret.idx -= to_del;
return ret;
}
self operator++(int) {
self temp = *this;
++idx;
return temp;
}
self &operator++() {
++idx;
return *this;
}
self operator--(int) {
self temp = *this;
--idx;
return temp;
}
self &operator--() {
--idx;
return *this;
}
};
template < typename tA, typename tB >
double_iterator<tA,tB> operator+(double_iterator<tA,tB> it, int
to_add) {
it.idx += to_add;
return it;
}
template < typename tA, typename tB >
double_iterator<tA,tB> operator+(int to_add, double_iterator<tA,tB>
it) {
it.idx += to_add;
return it;
}
int main(void){
int A[N];
float B[N];
for (int i = 0; i < N; ++i){
A[i] = rand(); B[i] = A[i] % 10;
cout << "\t" << A[i] << "\t" << B[i] << endl;
}
std::sort(double_iterator<int,float>(A,B),
double_iterator<int,float>(A,B,N));
for (int i = 0; i < N; ++i){
cout << "\t" << A[i] << "\t" << B[i] << endl;
}
return 0;
}
Best,
John
--
http://John.Torjo.com -- C++ expert
.... call me only if you want things done right
[ See http://www.gotw.ca/resources/clcm.htm for info about ]
[ comp.lang.c++.moderated. First time posters: Do this! ]