54

私は大きさと方向としてのベクトルの数学的/物理学の概念に精通していますが、プログラミングのコンテキストでベクトルへの参照にも出くわします(たとえば、C++にはstl::vectorライブラリがあります。 SOでかなり頻繁に)。

コンテキストからの私の直感は、それらが可変長配列の線に沿って何かを表すために最も頻繁に使用されるかなり原始的な構造であるということでした(そのサイズを大きさとして保存すると思います)が、誰かができれば本当に役に立ちますより完全な説明を提供してください。できれば、実際に使用する方法と理由を含めてください。

4

11 に答える 11

51

http://www.cplusplus.com/reference/stl/vector/から

ベクトルコンテナは動的配列として実装されます。通常の配列と同様に、ベクターコンテナの要素は連続した保存場所に保存されます。つまり、イテレータを使用するだけでなく、要素への通常のポインタのオフセットを使用して要素にアクセスできます。

ただし、通常の配列とは異なり、ベクトルのストレージは自動的に処理されるため、必要に応じて拡張および縮小できます。

さらに、ベクターは通常、任意のオブジェクトを保持できます。したがって、車両に関する情報を保持するクラスを作成して、フリートをベクターに格納できます。

ベクトルの優れた点は、サイズ変更は別として、配列のように、インデックスを介して個々の要素に一定時間でアクセスできることです。

サイズ変更のトレードオフは、現在の容量に達したときに、より多くのメモリを再割り当てし、場合によってはコピーする必要があることです。ただし、ほとんどの容量増加アルゴリズムは、バリアに到達するたびに容量を2倍にするため、プログラム操作全体で最悪の場合、おそらく12倍になるlog2(ヒープが利用可能)を超えることはありません。

-アダム

于 2009-02-03T18:47:26.980 に答える
28

数学では、ベクトルは方向と大きさの組み合わせと考えることができます。しかし、それはコーディネートと考えることもできます。たとえば、マグニチュード 5 で水平線からの角度が約 37 度のベクトルは、2D 平面上の点を表します。この点は、デカルト座標のペア (3, 4) で表すこともできます。このペア (3, 4) も数学ベクトルです。

プログラミングでは、この「ベクトル」という名前はもともと、固定長のスカラー数のシーケンスを表すために使用されていました。長さ 2 のベクトルは 2D 平面内の点を表し、長さ 3 のベクトルは 3D 空間内の点を表し、以下同様です。長さ 100 のベクトルは、100 次元空間内の点を表します (数学者はそのようなことを問題なく考えることができます)。

最近のプログラミング ライブラリでは、この「ベクトル」という名前は、一般に可変サイズの値のシーケンス (必ずしも数値ではない) を意味するようになりました。数学的ベクトルのサイズ (長さまたは次元) を変更することは、何らかの射影操作を行っていない限り、通常行うことではありません。しかし、一連の文字列を含むプログラミング ベクトルの長さを変更することは、一般的な操作です。

于 2009-02-03T18:59:28.110 に答える
7

あなたが慣れている数学的ベクトルはランク1のテンソルです; コンピュータサイエンスのデータ構造は、必ずしもテンソル変換規則に従うとは限りません。前述のように、これらは拡張および縮小できる単なる配列です。

于 2009-02-03T18:51:06.833 に答える
4

ベクトルコンテナは動的配列として実装されます。通常の配列と同様に、ベクターコンテナの要素は連続した保存場所に保存されます。つまり、イテレータを使用するだけでなく、要素への通常のポインタのオフセットを使用して要素にアクセスできます。

ただし、通常の配列とは異なり、ベクトルのストレージは自動的に処理されるため、必要に応じて拡張および縮小できます。

ベクトルは次の点で優れています。

  • 位置インデックス(一定時間)による個々の要素へのアクセス。
  • 要素を任意の順序で反復します(線形時間)。
  • その終わりから要素を追加および削除します(一定の償却時間)。

REF

于 2009-02-03T18:47:42.800 に答える
3

名前からあなたの混乱を理解することができます(私もそれによって混乱していました)。それは、数学的な定義に近い3Dグラフィックスプログラミングのベクトルのアイデアによって助けられません。数学では、ベクトルは任意の長さの1次元行列と考えることができます(長さは座標系の次元数です)。ほとんどのオブジェクト指向言語では、ベクトルは本質的に1次元の行列(配列)であるため、この名前が付けられています。プログラマーがそれらをそのタスクに使用することを決定しない限り、それらは座標とは何の関係もありません(これはまれです-私はそれを見たことがありません)。また、通常、行列の乗算や同様の演算を行うための数学演算子はありません。したがって、それらの1次元の性質は、類似性がどこで終わるかについてです。私'

于 2009-02-03T18:52:02.633 に答える
2

他の回答のうち少なくとも2つがこのサイトから貼り付けられているので、残りの説明もここで読むことをお勧めします... :-)

于 2009-02-03T18:49:47.583 に答える
2

SICPの本から:

コンピューターのメモリをモデル化するために、ベクターと呼ばれる新しい種類のデータ構造を使用します。抽象的には、ベクトルは複合データ オブジェクトであり、その個々の要素は、インデックスとは無関係な時間内に整数インデックスによってアクセスできます。

于 2009-02-03T19:04:55.557 に答える
0

https://isocpp.org/wiki/faq/containersには、この質問の内容を理解するために必要な多くの情報があります。ベクトルを連結リスト、配列などと対比します。

また、Stroustrup's Tour ( http://www.stroustrup.com/Tour.html ) の第 9 章から:

ほとんどのコンピューティングには、値のコレクションの作成が含まれます…. オブジェクトを保持することを主な目的とするクラスは、コンテナと呼ばれます。… 最も便利なstlコンテナはvector. Astl::vectorは、特定の型の要素のシーケンスです。要素はメモリに連続して格納されます。

したがって、STL ベクトルは同じ型の値のコレクションです— このように、ベクトル/モジュールの数学的な意味に似ています — しかし、主な問題は要素がどのように格納されるかです。

于 2015-08-31T21:23:58.740 に答える
0

プログラミングにおけるベクトルは、基本的に動的配列であり、ストレージは自動的に処理され、必要に応じて拡張および縮小できます。最も良い点は、通常の配列と同様に、インデックスを介して個々の要素に一定時間でアクセスできることです。

于 2016-03-20T17:52:50.010 に答える