std::listについて – プログラミング – Home

通知
すべてクリア

[解決済] std::listについて


ぶく
 ぶく
(@ぶく)
ゲスト
結合: 17年前
投稿: 5
Topic starter  

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<>を入れ子として使う方法って
一般的なのでしょうか?
プログラミングのセンスだと思うので、人それぞれかも知れませんが、
ネット上で探してもこういった使い方をしているようなサンプルが
見られないので、ちょっと質問してみました。
よろしくお願いします。


引用未解決
トピックタグ
επιστημη
 επιστημη
(@επιστημη)
ゲスト
結合: 22年前
投稿: 1301
 

> list<xxx>::iterator i = lst.begin();
> i += 3;
> とするとコンパイルエラーが発生します。
> これはなぜなのでしょうか?

random access iterator ではないので
operator += が定義されていないから。

> 線形リスト故に、i++でループまわさないと駄目と
> 言うことなのでしょうか?

かわりに std::advance(i,3);

> list<>を入れ子として使う方法って一般的なのでしょうか?

なにをもって一般的というのかわかりませんが、
ふつーにやりますけど。


返信引用
tetrapod
 tetrapod
(@tetrapod)
ゲスト
結合: 21年前
投稿: 830
 

線形リストと配列の記憶方式の違い(メモリ上の配置方式の違い)については
自分的に理解OK!と断言できる?ならば
> 線形リスト故に、i++でループまわさないと駄目と
> 言うことなのでしょうか?
答えは Yes ということになるよな。
ただ、こういう要求は多いので advance() ってのが用意されている。
list の advance の中身は ++ のループになっているわけだ。
vector の advance の中身は += ということで。

> list<>を入れ子として使う方法って一般的なのでしょうか?
そういう要望/必然があれば行う。

3番目の要素にアクセスするのに +=3 ではおかしい。


返信引用
ぶく
 ぶく
(@ぶく)
ゲスト
結合: 17年前
投稿: 5
Topic starter  

επιστημηさん
tetrapod さん

レスポンスありがとうございました。

>>std::advance(i,3);
初めて知りました。是非使ってみます。

>>3番目の要素にアクセスするのに +=3 ではおかしい。
+= 2ですね。

listの入れ子の件については、自分で作ったものがちゃんと
動いているので問題はないかな?とは思ったのですが、
同じ様な使い方をしているサンプルを見た事が無かったので、
実は変なコード?orもっと簡単でスマートな方法がある?
と気になった次第です。

ありがとうございましたm(__)m


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました