ListとVectorの違いについて

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
sql

ListとVectorの違いについて

#1

投稿記事 by sql » 5年前

件名の通りなのですが、ListとVectorの事はいろいろ調べて、まぁ、理解はできましたが、厳密に「このような時はどっち(ListかVectorか)を使うか」というのは例題がないためかイマイチわかりません。
皆様にお聞きしたいのは、どのようなプログラム(処理)の時にListを使うか、Vectorを使うかを教えて欲しいです。できれば簡単な例としてソースコードも載せてもらえたら嬉しいです。
お願いします。

たいちう
記事: 418
登録日時: 8年前

Re: ListとVectorの違いについて

#2

投稿記事 by たいちう » 5年前

ListとかVectorとか突然書かれても、何の言語のどのようなライブラリなのか、
回答者に伝わらない可能性があります。正確に伝える努力を心がけましょう。
大文字と小文字の使い分けも気を付けましょう。

C++のstd::listとstd::vectorの事だと仮定して書きます。
(他の配列とリストの話にも当てはまると思います)
ランダムアクセスが必要か、末尾以外へのデータの挿入や削除が頻発するか等が、判断の基準になります。

但し、多くの機能を共通で持っているので、不向きな選択をしてしまっても、
どうにもならなくなってしまうような事は起こらないかと。
自由にプログラムが作れるならば、どっちを使っても当面は問題ありません。
速度的にクリティカルになった場合、本当に必要ならば最適な方法を考えればよいでしょう。

初心者の段階であれこれと悩むよりは、多少非効率的でも、使えるようにするのがベストかと。

sql

Re: ListとVectorの違いについて

#3

投稿記事 by sql » 5年前

回答に急ぎすぎて大切なことを書き忘れていました・・・。
たいちう さんが書きました:C++のstd::listとstd::vectorの事だと仮定して書きます。
その通りです。

付加質問なのですが、以下の場合はどちらを使いますか?

txtファイルには文字列(「人の名前」)が300行書いてあります。(これが30000行に拡大するかもしれません・・・という状況で。)
DXlibのテキストから1行ずつ読み込んで文字列に格納する関数(名前忘れました)でどんどん追加(push_back)していきます。(しかしこれはコンストラクタ(初期化)で)、そして、ユーザー(プレイヤー)は任意の番号を指定して、指定された番号の名前を表示する。というプログラムが仮にあったとします。。

自分の場合は、vectorを使いランダムアクセスの方の速さを優先するのですが皆様はどのような方法をとりますか?
「list」か「vector」どちらかしか使えないという状況でお願いします。
それ以外にもっと全体的に処理が早くなる方法があるなら教えてください。

たいちう
記事: 418
登録日時: 8年前

Re: ListとVectorの違いについて

#4

投稿記事 by たいちう » 5年前

その状況ならばvectorです。listを選択する理由が全くありません。

先ほども書きましたが、まだ効率を考えるような必要はありません。
よっぽどひどいアルゴリズムならばともかく、vectorでもlistでも、
30000行程度ならば、体感できるような差はないはずです。

sql

Re: ListとVectorの違いについて

#5

投稿記事 by sql » 5年前

わかりました、ありがとうございます。


dic
記事: 555
登録日時: 8年前
住所: 宮崎県

Re: ListとVectorの違いについて

#7

投稿記事 by dic » 5年前

その30000行を読みこんで、表示する場合だったら
vectorでしょう

listだと先頭からしかアクセスできないので
仮に29999番目を選択したら
先頭から順番に29999個目を表示しないといけなくなります。
vectorだと、途中からアクセスできますので
1回目で表示したいところにアクセスできます。

ここにも同じような内容がかかれています。
http://d.hatena.ne.jp/cu_atsu/20110521/1305978324


http://www.cppll.jp/cppreference/cpp_stl.html
ここのサイトによると

ベクタは、配列と同様に格納された連続要素を保持する。 ベクタ要素へのアクセス、ならびに要素の追加は 定数時間 で完了する。 一方で特定の値を突き止める、ならびにベクタへの要素挿入は 線形時間 を要する。

リストは連結リストに格納された要素のシーケンスである。 ベクタ と比較して挿入と削除は速く、ランダムアクセスは遅い。

と書いてあります。

閉鎖

“C言語何でも質問掲示板” へ戻る