構造体の時のlistのソートのしかたが分かりません。
#include <list>
typedef struct {
int t_id;
char t_szype[256];
} t_list;
list<t_list> lst;
上記の場合にint t_idをキーにソートをしたいのですが、可能でしょうか。
環境はVC++6.0、Windows2000です。
構造体だろうがなんだろうがソートする時に構造体単位にデータを移動させれば
問題ないと思います。
t_idはユニークなデータですか。
あと、データ数によって、いろいろなソート法がありますが、
どのソートをお使いですか。
t_idはユニークではありません。
ソート方法が申し訳ありませんがよく分かっていません。
lst.sort()をやろうと思っていたのですが、このソートはどのメンバをキーにソートするのか
分からずにいます。
キーの優先順位としては t_id、t_szype です。
その後にユニークをしようかと思っていました。ソートとユニークはどちらが先でも良いかと思
っています。基本的なことが分かっておらずすみません。
こんな感じのことしたいんですか
typedef int (*COMP)(const void *, const void *);
int S_PAT1 (void *,void *);
void main(void)
{
qsort(BSW,rd_max,sizeof(t_list),(COMP)S_PAT1);
}
int S_PAT1(void *SD1,void *SD2 )
{
struct t_list *SCP1,*SCP2;
SCP1=(t_list *)SD1;
SCP2=(t_list *)SD2;
/* 2つの文字列全体の比較 */
if( SCP1->t_id > SCP2->t_id ) return (1);
if( SCP1->t_id < SCP2->t_id ) return (-1);
if( SCP1->t_szype > SCP2->t_szype ) return (1);
if( SCP1->t_szype < SCP2->t_szype ) return (-1);
return (0);
}
> lst.sort()をやろうと思っていたのですが、このソートはどのメンバをキーにソートするのか
> 分からずにいます。
list::sortは,operator<を利用してソートします。
構造体・クラスでは,operator<を自分で書く必要があります。
または,list::sortにbinary functionを渡す方法もありますが,
VC++ 6.0までのSTLではstd::greaterを特殊化する必要があるのでお勧めできません。
> キーの優先順位としては t_id、t_szype です。
bool operator< (const t_list & lhs, const t_list & rhs)
{
return (lhs.t_id < rhs.t_id) || (lhs.t_id == rhs.t_id && memcmp(lhs.t_szype, rhs.t_szype, 256) < 0);
}
こんなのを書けばいいです。
ちなみにC++では,
struct t_list { /* ... */ };
でも,t_listという識別子で利用可能です。
あと,qsortはSTLのコンテナ相手には使えませんし,普通は使いません。
だいたい,qsortよりstd::sortの方が簡単で速いし。
失礼しました 私のコードの場合C++としての機能を使ってないと思ってください
C言語 DOSアプリの時使ったコードですので!
YuO さんの方がC++コードとして適正かと思われます