Qt (B1) QListのソート
公開日| 2009年06月15日 | コメントはまだありません。
カテゴリー:Qt |
概要 : 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にオブジェクトのアドレスを設定する場合のソートは、どうすれば良いでしょうか?
ページ: 1 2

