OFF-SOFT.net

ウェブやソフトウェアに関するサポート&情報サイトです。サイト構築からソフトウェアの作成、利用まであなたの助けになるかも・・・・しれません。たぶん・・。

Qt (B1) QListのソート

公開日| 2009年06月15日 | コメントはまだありません。
概要 :
 Qt(1)-(10)までで、Qtの特徴を一通り説明してきました。(まだ、脱稿分があるかもしれませんが、随時、投稿されますのでご了承ください。) これから、Qt B シリーズでは、基本的なクラスの使い方を記載していきます。これらの記事は、Qtの初心者向けの記事です。

 今回のテーマは、QListのソートについてです。QtAlgorithmsのqSortを使って簡単にソートを行う例を簡単に説明してます。
Qtでは、複数の画面情報を取り出すとき、ほとんどQListのテンプレートを用いていると思います。
そのQListの中が、使う側の意図に沿って、並んでいるとはいえません。そんな時、QListの中を検索したり、順番を並べ替えたりしなければならないことがあります。
今回は、昇順、降順で、QListを並べ替えてみます。
ここで使用したサンプルソースコード:

簡単なint情報のソート
最も単純なQList<int>を使ってソートをしてみます。

[sample.cpp]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#include <QtGui>
#include <iostream>
 
using namespace std; 
 
//	dump list
void outputList(const char *title,QList<int> &plist )
{
	int ni;
	std::cout <<  title << std::endl;
	for(ni=0;ni<plist.count();ni++){
		std::cout << "[" <<  ni  << "]="<<  plist.at(ni) << std::endl;
	}
}
 
//	main
int main(int /* argc */, char* /*argv[]*/ )
{
	QList<int> olist;
	olist.append(1);
	olist.append(3);
	olist.append(2);
 
	outputList("Not Sort",olist);
 
	//	sort
	qSort(olist);
	outputList("Sorted",olist);
 
	return 0;
}

6行目から14行目までのoutputListは、コンソールへQList情報を出力する関数です。
実際にソートを実行しているのは、27行目です。
qSortへ、QListを渡しているだけです。

上記をコンパイルして、実行してみましょう。
上記は、コンソールアプリなので、以下のようにコンパイルします。
関連記事 : Qt(1)コンソールアプリでQtのパス制御を調べる

> qmake -project
> qmake "CONFIG+=console"
> nmake

実行結果は、以下のとおりです。

> debug\sort1.exe
Not Sort
[0]=1
[1]=3
[2]=2
Sorted
[0]=1
[1]=2
[2]=3

きれいに昇順にソートされたことがわかります。

さて、個別のクラスを使ったQListのソートはどのようにすれば良いでしょうか?

独自クラスのQListのソート
例えば、以下のような名前情報を持つクラスを作ったとしましょう。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
//	class for test
class MyName
{
public :
 
	MyName(const QString name) { m_sname=name; };
	MyName(const MyName &other) { *this=other; };
 
	QString WhatYourName() const  { return m_sname; };
 
	MyName & operator =(const MyName &other) { m_sname=other.m_sname;return *this; };
 
private:
	QString m_sname;
};

メソッドは、名前を問い合わせる"WhatYourName"ぐらいです。簡単なクラスです。
(QListを使用するためのコピーコンストラクタが必要なので作っています。)

このクラスでQListを作成して、ソートを実施してみましょう。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
//	main
int main(int /* argc */, char* /*argv[]*/ )
{
	QList<MyName> olist;
	MyName my1("test");
	MyName my2("taro");
	MyName my3("hanako");
	olist.append(my1);
	olist.append(my2);
	olist.append(my3);
 
	outputList("Not Sort",olist);
 
	//	sort
	qSort(olist);
	outputList("Sorted",olist);
 
	return 0;
}

こんな感じで、"test","taro","hanako"の順番でQListに入っているものをソートして、出力しています。

これをコンパイルするとエラーが出力されます。
   qalgorithms.h(178) : error C2678:

これは、qSortで必要としているメソッドが、MyNameに存在しないエラーです。
qSortを上記のような使い方をする場合、MyNameに operator < をオーバーロードしなければなりません。
つまり、qSortは、各クラスの operator < を起動して、ソートを行っているということです。

では、早速、 operator < を追加してみましょう。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
//	class for test
class MyName
{
public :
 
	MyName(const QString name) { m_sname=name; };
	MyName(const MyName &other) { *this=other; };
 
	QString WhatYourName() const  { return m_sname; };
 
	MyName & operator =(const MyName &other) { m_sname=other.m_sname;return *this; };
	bool   operator <(const MyName &other) const { return (m_sname<other.WhatYourName()); };
 
private:
	QString m_sname;
};

12行目に operator < が追加されました。
これをコンパイルすると正常にコンパイルできますので、続けて実行してみましょう。

> debug\sort2.exe
Not Sort
[0]=test
[1]=taro
[2]=hanako
Sorted
[0]=hanako
[1]=taro
[2]=test

うまく、名前の昇順でソートできました。

次は、降順でソートしてみましょう。

独自クラスのQListのソート(降順)
降順でソートさせるには、qSortに降順でソートするようにパラメータで指定します。
いままで、以下のようにqSortへのパラメータを指定していました。

1
	qSort(olist);

降順にするために、以下のようにqSortへのパラメータを指定します。

1
	qSort(olist.begin(),olist.end(),qGreater<MyName>());

第1,第2引数は、olistのソート範囲です。第3引数が、降順で実施するように指定したものです。
qGreaterというテンプレート関数が用意されていて、そこにクラスを指定するだけです。

もともと、昇順の場合も、以下のように指定するとことろをパラメータを略したにすぎません。

1
	qSort(olist.begin(),olist.end(),qLess<MyName>());

qGreaterが降順、qLessが昇順というわけです。
では、以下のようにmainルーチンを変更して、実行してみましょう。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
//	main
int main(int /* argc */, char* /*argv[]*/ )
{
	QList<MyName> olist;
	MyName my1("test");
	MyName my2("taro");
	MyName my3("hanako");
	olist.append(my1);
	olist.append(my2);
	olist.append(my3);
 
	outputList("Not Sort",olist);
 
	//	sort - qLess
	qSort(olist.begin(),olist.end(),qLess<MyName>());
	outputList("Sorted(qLess)",olist);
 
 
	//	sort - qGreater
	qSort(olist.begin(),olist.end(),qGreater<MyName>());
	outputList("Sorted(qGreater)",olist);
 
	return 0;
}

実行結果は、以下のとおりです。

> debug\sort4.exe
Not Sort
[0]=test
[1]=taro
[2]=hanako
Sorted(qLess)
[0]=hanako
[1]=taro
[2]=test
Sorted(qGreater)
[0]=test
[1]=taro
[2]=hanako

次は、QListにオブジェクトのアドレスを設定する場合のソートは、どうすれば良いでしょうか?



ブックマークへ追加: はてなブックマークへ追加するdel.icio.usLivedoor ClipYahoo!FC2Nifty ClipPOOKMARK. AirlinesBuzzurl(バザール)Choixnewsing

Trackback URL

このコメントは管理人から承認された後、表示されます。


コメント

コメントをどうぞ





*





donate red cross
がんばろう、日本!
日本赤十字の募金は、Googleで受け付けてます。
http://www.google.co.jp/intl/ja/crisisresponse/japanquake2011.html

義援金詐欺・フィッシングサイトにご注意ください。

コンテンツ

最近の記事


タグクラウド

リンク

このサイトは?

ウェブやソフトウェアに関するサポート&情報サイトです。サイト構築からソフトウェアの作成、利用まであなたの助けになるかも・・・・しれません。たぶん・・。

ブックマークへ追加

はてなブックマークへ追加するdel.icio.usLivedoor ClipYahoo!FC2Nifty ClipPOOKMARK. AirlinesBuzzurl(バザール)Choixnewsing