■
ソートされていない整数6個で構成される配列があったとしよう。
このうち小さい順に3個は数値を1増やすとする。
例えば{4,5,6,1,2,3}が与えられたとき
これを{4,5,6,2,3,4}とする
そのためにはどうするかと考えた結果、これらの数値へのポインターで構成されるベクターを作り、
このベクターをポインターの指している整数の大きさで並び替えればいいという結論に至った。
よくありそうな操作なのでもしかしたらもっといい方法で実現されているのかもしれないが、
sort関数の使い方やoperatorのオーバライドの勉強にもなるので作ってみた
#include<iostream> #include<vector> #include<algorithm> using namespace std; template <class T> class pointer{ T *p; public: pointer(T *p){ this->p=p; } T& operator*()const{ return *p; } }; bool operator<(const pointer<int> &lh, const pointer<int> &rh){ return *(lh)<*(rh); } int main(void){ int nums[]={6,5,4,3,2,1}; vector< pointer<int> > p_nums; for(int i=0;i<sizeof(nums)/sizeof(int);i++) p_nums.push_back(pointer<int>(nums+i)); sort(p_nums.begin(),p_nums.end());//sort! for(int i=0;i<p_nums.size();i++) cout<<*(p_nums[i])<<endl; for(int i=0;i<3;i++){ *p_nums[i]+=1; } cout<<"fist 3 element in the sorted vector +=1,and the same time," "it is also done in unsorted one"<<endl; for(int i=0;i<p_nums.size();i++) cout<<nums[i]<<endl; }
pointerというクラスはポインターをメンバに持つクラスでoperator*をオーバライドすることであたかもポインターのような振る舞いをする
そしてこのクラスの大小比較を行うためのoperator<をオーバライドすることでsort関数を実行し、ベクタのソートが行われる
そしてソートしたベクタの要素は元の配列の要素を指しているのでインクリメントが元の配列の要素にも反映される
pointerクラスはboostのshared_ptrを使えば同じことができる気がする