2012年1月15日日曜日

( Qt C++ )コンテナ用イテレータの種類(Javaスタイルイテレータ)


イタリアが危ないだのスペインが危ないだの世界がきな臭い方向へ進んでいる気がします。日本も借金は自国からのものだから大丈夫みたいなことを政治家は言ってますが、だったら増税なんかしなくてもいいだろと、大丈夫なんだったら無限に自国で国債発行しまくればいいだろとツッコミたくなります。なんにせよ日本は大丈夫っていうあの理論は嘘くさくて仕方がありません。...まぁだからといって国外への逃げ道なんて用意していませんがね。


はいそれではコンテナ用イテレータの種類について書いていきます。
前回、前々回の記事でQVector,QLindedlist,QListについて書きましたが、そのサンプル内でイテレータを使ったものがあったかと思います。Qtでは
①Javaスタイルイテレータ
②STLスタイルイテレータ
の2種類が用意されています。今回はJavaスタイルイテレータについて書いていきます。(イテレータについてはWikiでも見てください。)


①Javaスタイルイテレータ
読み込みイテレータと読み書きイテレータの2種類が用意されています。
読み込みイテレータは「クラス名Iterator」のような名前で、読み書きイテレータは「QMutableクラス名Iterator」のように"Mutable"が名前につきます。
Javaスタイルイテレータは要素そのものではなく要素の"間"を指します。
以下の図のような感じです。

要素の間を指すということに留意して、要素の削除や挿入には十分注意してください。

それではサンプルを書いていきます。(C++ GUI Programming with Qt4 254ページを参考)
いつものようにQtCreaterの使用を前提とします。(QtCreaterなどの使い方は ”Qtをはじめよう" を見てください。)

ではコードを


(読み込みイテレータサンプル)
//...

QList<QString> list;
list << "One!" << "Two!" << "T";

QListIterator<QString> i(list);//読み込み用イテレータ宣言

int index = 0;
while(i.hasNext())//hasNextは右側に要素があればtrue
{
    i.next();//次の右要素の間へ移動
    index++;
}
    
list[index-1] = "Three!";

//最終的にlistには[ "One!", "Two!", "Three!" ]が入っている

はい簡単ですね。コメントの通りです。ちなみに左側の要素の間へ移動する時は.previous()で行います。その他関数はリファレンスを参照してください。(リファレンス)(QListIteratorのリファレンスはこちら)


(読み書きイテレータサンプル)
//...

QList<QString> list;
list << "One!" << "Two!" << "T";

//読み書きイテレータ
QMutableListIterator<QString> i(list);

i.findNext("T");//"T"という値が格納されていれば、その要素の直後の位置に移動
i.setValue("Three!");//直前の要素に値をセットする

//最終的にlistには[ "One!", "Two!", "Three!" ]が入っている

さらに簡単ですね。これもコメントの通りです。読み書きイテレータのほうが使い勝手がいいのでよく使うかと思います。
その他、読み書きイテレータにはinsertなど挿入用の関数なども用意されていますのでリファレンスで確認してみてください。

以上です。
次回はコンテナ用イテレータの種類(STLスタイルイテレータ)です。