• ベストアンサー

(STL) vectorとlistの違い

vectorとlistの違いって何なんでしょうか。 vectorは動的な配列の確保で listも動的な配列だけど双方向探索やソートもできる、 つまりlistはvectorの機能を含む拡張版みたいなもの、こう考えてよろしいのでしょうか? いまいちvectorとlistが同じようなものに見えて仕方ないのです・・。

質問者が選んだベストアンサー

  • ベストアンサー
  • WizTaka
  • ベストアンサー率53% (7/13)
回答No.3

vector と list の違いというか,動的配列とリストの違いと言うべきでしょうか? //-------------------------------------------------------- < 動的配列の特徴 > ・ランダムアクセスが得意 ・シーケンシャルアクセス (順次アクセス) が得意 ・挿入,削除が苦手 ・動的なサイズ変更が苦手 < リストの特徴 > ・ランダムアクセスが苦手 ・シーケンシャルアクセスが得意 ・挿入,削除が得意 ・動的サイズ変更が得意 ※ここでは "得意 = 速い","苦手 = 遅い" と考えても OK です. //-------------------------------------------------------- 以上の特徴はそれぞれのデータ構造の違いからくるものです. これらの特徴が分かれば "同じ" とは思わない (思えなくなる) ハズです. 使う際にはそれらの特徴を十分に吟味し,今使用するべきはどちらかを考える必要がありますね. また,この特徴をより理解するためにはデータ構造について学習する必要があります. STL を使うのではなく一度自分で動的配列クラスやリストクラスを作成してみると,その違いが歴然と分かると思います. 理解のために,頑張って!

amazontester
質問者

お礼

なるほど。。。こんな違いがあったんですね。とても勉強になりました!

その他の回答 (2)

  • koko_u_
  • ベストアンサー率18% (459/2509)
回答No.2

>つまりlistはvectorの機能を含む拡張版みたいなもの、こう考えてよろしいのでしょうか? 両者のクラスに実装されているメソッドを比較してみるのがよろしいかと。

  • MrBan
  • ベストアンサー率53% (331/615)
回答No.1

> vectorとlistの違いって何なんでしょうか。 「データ構造」の違いです。 何かを処理するとき、あらかじめ並び順や置き方を考えておくとやりやすい、そのやり方が違います。 > vectorは動的な配列の確保でlistも動的な配列だけど双方向探索やソートもできる、 vectorでもSTLで双方向探索やソートができます。 違うのは、それぞれの効率などです。 この処理はvectorの方が向いているので速い、でもこれはlistの方が速い。 「データ構造」と「アルゴリズム」には相性があり、向き不向きがあります。 > つまりlistはvectorの機能を含む拡張版みたいなもの、こう考えてよろしいのでしょうか? シンプルなvectorが基本だとは思いますが、必ずしもlistが拡張は思えません。 どちらかと言うと別物です。 > いまいちvectorとlistが同じようなものに見えて仕方ないのです・・。 「データ構造」や「アルゴリズム」の特性/特徴を理解せずに見れば、 使い勝手としては大差ないです。 (ある程度同じ方法で使えるようにできてるのがSTLですから) データ構造について勉強してみてください。

amazontester
質問者

お礼

同じように使えるんですね。当面は両方使ってみて色々考えてみたいと思います。 ありがとうございました!

関連するQ&A

  • STLのlist どのデータでソートするか分からないデータでソートを行うには?

    class data { public: 文字列型* str; //コンストラクタでN個の配列を生成 int N; //文字列の配列の個数 }; list<data> obj; と書いて、objに対して大量にデータを追加した後、その要素をソートするところで困っています。 データを文字列型のデータの配列の特定のオブジェクトを使ってソートするのに、その方法が見つかりません。 リストのデータの一つ目 str[0] = "abc"; str[1] = "def"; リストのデータの二つ目 str[0] = "ghi"; str[1] = "jkl"; というリストのデータがあったときに、str[0]の要素でソートしたいということなのですが........ メンバのint型などについては、operator<をオーバーロードする方法が見つかったのですが........

  • ATLとSTLの違いは何でしょうか?

    ATLとSTLの違いは何でしょうか? STLでもリスト構造(線形リスト、[双方向リスト]) #include <list>があるみたいですが・・・ STLはC++の標準テンプレートライブラリ(そのまま)と理解しています。 あと、ActiveXとALTの違いも知りたいです。 極論しますが、ActiveXとはOCXを作ることでしょうか?

  • perlのリストと配列の違いについて

    Perlの本を読んでいたらリストというのがでてきました。 読んでいてもリストと配列の違いがよくわかりません。 リストと配列はどう違っていてどのように使いわけるのでしょうか?

    • ベストアンサー
    • Perl
  • Vectorを要素とするVector

    初めまして。 迷路の順路探索を行うプログラムを作成し、 その際Point型の座標データを始点から一定の歩数まで順に並べたVector型オブジェクトrouteと、 そのrouteを要素に持つVector型オブジェクトstoreを定義しました。 ところが、新しく探索したrouteをstore.addElement(route)で追加したところ、 storeの全要素が新しいrouteで上書きされてしまいました。 結果、探索が一方向にしか進まないという状態で詰まっています。 SunのVectorクラスの仕様を読んでも解決の糸口らしいものが見えないのですが、 何かこの現象を回避する方法はないものでしょうか。

    • ベストアンサー
    • Java
  • Firefox1.5の拡張機能リスト 

    拡張機能リストに削除不可能なモノがが残っており、その削除方法があれば教えてください。 残ってしまっている拡張機能ですが・・・ *間違ってThunderbirdの拡張機能をインストールしてしまった。(Display mail route) *英語版と日本語版をインストールして、英語版を削除したけれど、拡張機能名だけ残ってしまった。(adblock plus en-US) *拡張をインストールした時何故か、同じ拡張機能名が2つリストにのり、一つは正常ですが、もう一つは削除も何も出来ない状態。(Adblock filterset.G updater) これら3つリストにありながら、右クリックしても「設定」「ホームページを表示」やら「無効」「削除」などメニューがクリックできない機能しないグレーの文字色の状態なんです。。 プロファイルを全く削除して全て再インストールするしか方法がないのでしょうか? それをするのがやはり億劫で何かファイルを操作してこのうっとうしい拡張機能リストの行を削除出来ないだろうか・・・と。思っております。 ネットで調べてみましたが、見つからずで、どなたかこちらで力になってくださいませんでしょうか? どうぞ、よろしくお願いいたします!

  • ベクトル

    違いが分からなくて困っています。ベクトルA=ax+(-7)ay+5az、ベクトルB=(-4)ax+(-2)ay+2azがあったとしてAのB方向成分の大きさとAのB方向のベクトルはどのように違い、どうやって計算すればよいのでしょうか?

  • 関数内の配列$list[0]~$list[20]を、GETで渡したい

    関数内で生成した配列$listを、GETで渡す方法ってあるでしょうか。 只の変数$hogeなら例えば $hoge = 'AAA'; ●●.php?$mode=sort&hoge2=$hoge でリンクし if($mode=="sort") 内で、$hoge2として扱えますが 配列$hoge[0]~$list[20]とかを渡すときはどうすればいいでしょうか。 メモリーが心配なので、できれば参照で渡したり、グローバル化して受け取るなどの方法を使いたいです。よろしくお願いします。

    • ベストアンサー
    • PHP
  • STLを使わずに可変長配列を再現する方法

    STLのlistが(配列に比べると)想像以上に遅かったので C++で可変長配列を再現したいのですけども 配列の拡張が思った以上に遅く困っています。 毎回newではオーバーヘッドが発生しますので、 現在は配列を一定数確保しておき 足りなくなったら配列を拡張(再確保)しています。 現在の配列のアドレスを一旦退避させてdeleteし、 新たにnewで生成して復帰させるといった感じです。 ただしこれでは、配列の要素数が増えるほど遅くなり、 オブジェクトの参照ならまだしも実体の場合は 全てコピーしなければならないので、 場合によってはSTLのlistよりも遅くなってしまいます。 newで生成してるのでできればreallocは使わずに 再現したいのですが、どうにか方法は無いでしょうか? よろしくおねがいします。 //----------------------------------------------- struct Test {   int val;   Test( int _val ){ val=_val; } }; Test obj1( 1 ); Test obj2( 2 ); Test obj3( 3 ); // 元のデータに代入 Test **ptr = new Test*[2]; ptr[0] = &obj1; ptr[1] = &obj2; // 退避させる Test **tmp = new Test*[2]; for( int i=0; i<2; i++ ) tmp[i] = ptr[i]; // 拡張する delete [] ptr; ptr = new Test*[4]; // 復帰させる for( int i=0; i<2; i++ ) ptr[i] = tmp[i]; delete [] tmp; ptr[2] = &obj3; //----------------------------------------------- ※NULLチェックなどはここでは省いています。

  • listの maxsize()と size()の違いは・・・

    listクラスのmaxsize()メンバとsize()メンバの違いは vectorクラスのcapacity()メンバとsize()メンバの違いと思っていいのでしょうか?

  • ベクトルの積って?

    はじめまして ベクトルの積ってあるじゃないですか 例えば、ある物を、2という力と、3という力で同一方向に引っ張る時に、2+3で5の力だと思うのですが、 何かの本で2x3で6だと書いてありました この違いがわかりません 教えていただけませんか

専門家に質問してみよう