構造体の時のlistのソートの方法を教えてください – プログラミング – Home

構造体の時のlistのソートの方法を教...
 
通知
すべてクリア

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


アセロラ
 アセロラ
(@アセロラ)
ゲスト
結合: 23年前
投稿: 5
Topic starter  

構造体の時の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です。


引用解決済
トピックタグ
アイススケーター
 アイススケーター
(@アイススケーター)
ゲスト
結合: 23年前
投稿: 280
 

構造体だろうがなんだろうがソートする時に構造体単位にデータを移動させれば
問題ないと思います。

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


返信引用
アセロラ
 アセロラ
(@アセロラ)
ゲスト
結合: 23年前
投稿: 5
Topic starter  

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


返信引用
wood
 wood
(@wood)
ゲスト
結合: 23年前
投稿: 895
 

こんな感じのことしたいんですか

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
 YuO
(@YuO)
ゲスト
結合: 24年前
投稿: 252
 

> 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
 wood
(@wood)
ゲスト
結合: 23年前
投稿: 895
 

失礼しました 私のコードの場合C++としての機能を使ってないと思ってください
C言語 DOSアプリの時使ったコードですので!

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


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました