vector の使い方について

[戻る]
キット 2015/09/08(火) 01:40:25
STLのVectorをfor文などで読み取る場合についてなのですが、
なぜiteratorという難しいものを使っているのでしょうか?

下記のような場合は、後者のほうが明らかに分かりやすいと思います。
初心者質問で申し訳ありません。
初めてvectorを見たときは前者だったので???でしたが、
後者だったらSTLを知らなくてもなんとなく理解できるものだったので。

vector<int>::iterator aaa(10);

// 初心者には分かりにくい
for( vector<int>::iterator it = aaa.begin(); it != aaa.end(); it++ )
{
    int bbb = *it
}

// こっちのが分かりやすい
for( int i=0; i < aaa.size(); it++ )
{
    int bbb = aaa.at(i);
}

仲澤@失業者 2015/09/08(火) 15:07:05
難しい質問ですね。
以下はSTLに対する個人的で、一面的な見解ですが、参考にしてください。

まず、STLは単純化すると「要素の集合の制御」を意味する抽象的なコードです。
(もちろんそうでない部分もあります)

1.STLで扱う「集合」にはいくつかの種類があり、中には単純に連続した配列では
 無い場合があります。

2.従って、要素を指し示す方法としての、operator[](index)や
 operator++ではうまくいかない場合も想定できます。
 一般的には、その方法は集合の実装に依存するでしょう。

3.一方、集合である以上要素の一つを指し示す機能は絶対必要です。
 また、集合に対する制御としての「指し示す」方法は一義でありたい
 と思ったのかもしれません。

4.そこでSTLを設計した人たちは、指し示す機能を、
 個々の集合の具体的実装内容から分離させて、
 独立した概念としての「指し示すもの」=「イテレータ」を定義しました。

てな感じでしょうか。

もっとも、個人的にはイテレータの概念は必要以上に複雑であるとは思っており、
また、これがためにごく単純な配列の場合は使いづらくなっているとも感じています。
しかもあんまり早くないので、速度を要求されるコードには使ってませんです。

ITO 2015/09/08(火) 16:48:07
うーーん、
FOR文等を使ってシーケンシャルに読み書きするだけなら単純な方法でいいと思います。

昔、ATLのLISTを(MFCのコネクション関数)使ったときは絶えずステータス関数で位置をチェック
していました。

確か、VECTOR関数は多機能でLISTのようにランダムに読み書きできますよね?
そのような使い方をするときは、「イテレータ」を使い絶えず位置を確認・指定して
いないと、まずいのではと思います。

キット 2015/09/08(火) 21:35:50
[[解決]]
仲澤@失業者さん、ITOさん、回答ありがとうございます。

質問の仕方が悪かったですね。申し訳ありません。

iteratorを使っている解説サイトが多いけど、あまり使う意味が無いんじゃないの?
aaa.at(i)〜としてアクセスしたほうが楽で良いのでは?
という素朴な疑問でした。

私が扱う程度の簡単な読み書きでしたら、
単純な方法で問題ないということで良かったです。
○○な理由で、簡単な場合もiteratorを使うほうが望ましい!とかでは無いようで・・・

ありがとうございました。

AR 2015/09/11(金) 00:25:40
 もう解決済みになっちゃいましたが、イテレーターを使うメリットを実感できた経験談
です。

 最初vectorで作ってたソフトがあったんですが、先頭にアイテムを挿入するというケー
スがも出てきましたので途中でdequeに変更しました。
 その際に宣言部分だけの変更で、ほとんどロジックを変更せずに済みました。

 それ以来、個人的にイテレーターを多用するようになりましたね。
 アルゴリズムと使い方を分けられると考えても良いかもしれません。

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