CArrayの順番を変えずに大小比較して、順序を代入するには?

解決


Satsu  2012-04-02 21:05:08  No: 73275  IP: 192.*.*.*

環境: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の順番は変えたくありません。



どなたかご教授よろしくお願いいたします。

編集 削除
επιστημη  URL  2012-04-03 05:50:55  No: 73276  IP: 192.*.*.*

> CArray<ClassX, ClassX&> aryX;
> aryX.Sort(); // この関数で実現させたい。

無理。 Sort() は CArrayのメンバ関数ではない。

編集 削除
Satsu  2012-04-03 07:49:27  No: 73277  IP: 192.*.*.*

すみません、間違えました。
以下のように自作関数でソートできれば良いです。

class ABC
{
CArray<ClassX, ClassX&> aryX;
Sort(); // この自作関数で実現させたい。
}

編集 削除
tetrapod  2012-04-03 08:57:39  No: 73278  IP: 192.*.*.*

記憶空間を一時的にでも使ってよいのなら
pair<__int64, INT_PTR> の配列を作って <m_target, index> を記憶し
これをソートして m_number に index 入れるとか。

編集 削除
επιστημη  URL  2012-04-04 09:00:23  No: 73279  IP: 192.*.*.*

> 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;
  }

}

編集 削除
Satsu  2012-04-05 11:28:52  No: 73280  IP: 192.*.*.*

できました、επιστημηさん、ありがとうございます。

編集 削除