list<xxx>へのアクセスについて質問です。
vector<xxx>の場合で、例えば変数名vecとした場合、
3番目の要素にアクセスしたい場合、vec[2]とするか、
vector<xxx>::iterator i = vec.begin();
i += 3;
とし、*iでアクセス出来ると思います。
listの場合[]は使えないので、イテレータを使う方法しか
ないとは思うのですが、変数名をlstとした場合、
list<xxx>::iterator i = lst.begin();
i += 3;
とするとコンパイルエラーが発生します。
これはなぜなのでしょうか?
線形リスト故に、i++でループまわさないと駄目と
言うことなのでしょうか?
また、別でもう1点ですが、
list<list<XXX*>> lst_a;
list<XXX*> lst_b;
lst_b.push_back(new XXX());
lst_a.push_back(lst_b);
こんな感じで、list<>を入れ子として使う方法って
一般的なのでしょうか?
プログラミングのセンスだと思うので、人それぞれかも知れませんが、
ネット上で探してもこういった使い方をしているようなサンプルが
見られないので、ちょっと質問してみました。
よろしくお願いします。
> list<xxx>::iterator i = lst.begin();
> i += 3;
> とするとコンパイルエラーが発生します。
> これはなぜなのでしょうか?
random access iterator ではないので
operator += が定義されていないから。
> 線形リスト故に、i++でループまわさないと駄目と
> 言うことなのでしょうか?
かわりに std::advance(i,3);
> list<>を入れ子として使う方法って一般的なのでしょうか?
なにをもって一般的というのかわかりませんが、
ふつーにやりますけど。
線形リストと配列の記憶方式の違い(メモリ上の配置方式の違い)については
自分的に理解OK!と断言できる?ならば
> 線形リスト故に、i++でループまわさないと駄目と
> 言うことなのでしょうか?
答えは Yes ということになるよな。
ただ、こういう要求は多いので advance() ってのが用意されている。
list の advance の中身は ++ のループになっているわけだ。
vector の advance の中身は += ということで。
> list<>を入れ子として使う方法って一般的なのでしょうか?
そういう要望/必然があれば行う。
3番目の要素にアクセスするのに +=3 ではおかしい。
επιστημηさん
tetrapod さん
レスポンスありがとうございました。
>>std::advance(i,3);
初めて知りました。是非使ってみます。
>>3番目の要素にアクセスするのに +=3 ではおかしい。
+= 2ですね。
listの入れ子の件については、自分で作ったものがちゃんと
動いているので問題はないかな?とは思ったのですが、
同じ様な使い方をしているサンプルを見た事が無かったので、
実は変なコード?orもっと簡単でスマートな方法がある?
と気になった次第です。
ありがとうございましたm(__)m