Re: Sorting two arrays with one call to sort()?
On Sep 27, 6:10 am, jtorjo2...@yahoo.com wrote:
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
Here is what you get with g++ 3.4.4,
I do not have VS...sorry. Please post portable code.
/usr/lib/gcc/i686-pc-cygwin/3.4.4/include/c++/bits/stl_algo.h: In
function `const _Tp& std::__median(const _Tp&, const _Tp&, const _Tp&)
[with _Tp = double_iterator<int, float>::value_type]':
/usr/lib/gcc/i686-pc-cygwin/3.4.4/include/c++/bits/stl_algo.h:2482:
instantiated from `void std::__introsort_loop(_RandomAccessIterator,
_RandomAccessIterator, _Size) [with _RandomAccessIterator =
double_iterator<int, float>, _Size = int]'
/usr/lib/gcc/i686-pc-cygwin/3.4.4/include/c++/bits/stl_algo.h:2553:
instantiated from `void std::sort(_RandomAccessIterator,
_RandomAccessIterator) [with _RandomAccessIterator =
double_iterator<int, float>]'
x.cpp:108: instantiated from here
.....
There are more...
Another question is: Can this code be made portable and simplified
to make it shorter? Maybe by deriving it from std::iterator?
--
[ See http://www.gotw.ca/resources/clcm.htm for info about ]
[ comp.lang.c++.moderated. First time posters: Do this! ]