構造体の時のlistのソートの方法を教えてください

[戻る]
アセロラ 2002/10/13(日) 13:07:42
構造体の時の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です。

アイススケーター 2002/10/13(日) 13:35:44
構造体だろうがなんだろうがソートする時に構造体単位にデータを移動させれば
問題ないと思います。

t_idはユニークなデータですか。
あと、データ数によって、いろいろなソート法がありますが、
どのソートをお使いですか。

アセロラ 2002/10/13(日) 14:18:11
t_idはユニークではありません。
ソート方法が申し訳ありませんがよく分かっていません。
lst.sort()をやろうと思っていたのですが、このソートはどのメンバをキーにソートするのか
分からずにいます。
キーの優先順位としては t_id、t_szype です。
その後にユニークをしようかと思っていました。ソートとユニークはどちらが先でも良いかと思
っています。基本的なことが分かっておらずすみません。

wood 2002/10/13(日) 21:16:06
こんな感じのことしたいんですか

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

YuO [E-Mail] 2002/10/14(月) 18:09:21
> 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の方が簡単で速いし。

wood 2002/10/14(月) 21:52:21
失礼しました 私のコードの場合C++としての機能を使ってないと思ってください
C言語 DOSアプリの時使ったコードですので!

YuO さんの方がC++コードとして適正かと思われます

古いスレッドには追加発言できません。