環境:VC++ 2005 WindowsXP
CArray<ClassX, ClassX&> を用い、ClassXは次のような定義をしています。
class ClassX
{
public:
Sort();
INT64 m_target;
int m_number;
}
class ABC
{
CArray<ClassX, ClassX&> aryX;
aryX.Sort(); // この関数で実現させたい。
}
ClassXを持つCArrayが存在し、"INT64 m_target"には適当な値がすでに入っています。
m_targetの大小比較をして、小さい順に
m_number へ0,1,2,3・・・のように、代入するようなコードを書きたいのですが、
良い実装方法が分かりません。
できれば、すでに代入されているaryXの順番は変えたくありません。
どなたかご教授よろしくお願いいたします。
> CArray<ClassX, ClassX&> aryX;
> aryX.Sort(); // この関数で実現させたい。
無理。 Sort() は CArrayのメンバ関数ではない。
すみません、間違えました。
以下のように自作関数でソートできれば良いです。
class ABC
{
CArray<ClassX, ClassX&> aryX;
Sort(); // この自作関数で実現させたい。
}
記憶空間を一時的にでも使ってよいのなら
pair<__int64, INT_PTR> の配列を作って <m_target, index> を記憶し
これをソートして m_number に index 入れるとか。
> pair<__int64, INT_PTR> の配列を作って <m_target, index> を記憶し
> これをソートして m_number に index 入れるとか。
やってみた。
#include <afxtempl.h>
#include <algorithm>
#include <vector>
#include <cstdlib>
#include <iostream>
using namespace std;
class ClassX {
public:
INT64 m_target;
int m_number;
};
struct work {
INT64 m_target;
int* p_number;
work(ClassX& x) : m_target(x.m_target), p_number(&x.m_number) {}
};
bool operator<(const work& x, const work& y) {
return x.m_target < y.m_target;
}
int main() {
const int N = 20;
CArray<ClassX,ClassX&> aryX;
// テキトーな値を詰める
for ( int i = 0; i < N; ++i ) {
ClassX item;
item.m_target = rand()%9 + 1;
item.m_number = -1;
aryX.Add(item);
}
// bufにコピーして
vector<work> buf;
for ( int i = 0; i < N; ++i ) {
buf.push_back(work(aryX[i]));
}
// ソート
sort(buf.begin(), buf.end());
// 順位をつけて
for ( int i = 0; i < N; ++i ) {
if ( i == 0 ) {
*buf[i].p_number = 0;
} else if ( buf[i].m_target == buf[i-1].m_target ) {
*buf[i].p_number = *buf[i-1].p_number;
} else {
*buf[i].p_number = i;
}
}
// プリント
for ( int i = 0; i < N; ++i ) {
cout << aryX[i].m_target << ':' << aryX[i].m_number << endl;
}
}
できました、επιστημηさん、ありがとうございます。
ツイート | ![]() |