私はstd::deque<record *>
に格納されたテーブル全体を持っており、ユーザが任意のカラムでテーブルをソートできるようにする必要があります。表は、リストボックス形式でユーザーに提示されます。複数のデータ型で動作するようにstd :: mapを比較するには?
各レコードは複数の文字列(文字列の構造体)で構成されています。ただし、フィールドはすべて文字列として格納されていますが、時間(HH:MM:SS)、浮動小数点数、および文字列の型が異なります。
ユーザーは、これらの列のいずれかで並べ替えることができます。ユーザーが列をクリックすると、テーブルがソートされた形式でユーザーに表示されるように、各レコードがマルチマップに格納されます。
しかし、列の種類が異なるため、これらをすべて効率的に処理する1つの比較方法を作成するにはどうすればよいですか。
私はタイプごとに、次の方法
- 使用異なるマップを考え、もう1つはマップごとに機能のクラスを比較する書き込み。
- 3つの異なるすべての型を処理する比較クラスを使用して、単一のマップを使用します。しかし、挿入するたびに、比較クラスは型を決定し、それに応じて挿入する必要があります。
この2つの方法よりも良い方法はありますか?
例:
struct ltDataCompare
{
bool operator()(const CString& csData1, const CString& csData2) const
{
if (isTimeFormat(csData1) && isTimeFormat(csData1))
{
// Do time relevant comparision
}
else if (isNumberFormat(csTime1) && isNumberFormat(csTime2))
{
double dPrice1 = atof((LPCTSTR)csTime1);
double dPrice2 = atof((LPCTSTR)csTime2);
return (dPrice1 < dPrice2);
}
return (csTime1 < csTime2);
}
};
std::multimap<CString,list_record_t*,ltDataCompare> _mapAllRecords; // Used only for sorting
あなたは何を比較していますか?浮動小数点数を文字列と比較するのは意味がありますか?編集:申し訳ありませんが、私はあなたが意味するものを参照してください。レコードの1つまたは複数のフィールドをソートする必要があります。さて、ソート関数(またはラムダ)に渡すフィールドenumでこれを行うことができます。その後、enum値に応じて比較関数で適切な値を使用します。 – Robinson
Robinsonの例を示してください。 – user373215
Robinsonでは、すべてのフィールドが文字列として格納されます。私はフィールドの種類を決定し、適切な並べ替え/比較を行う必要があります。 – user373215