web-dev-qa-db-ja.com

ベクターとは何ですか?また、プログラミングではどのように使用されますか?

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

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

37

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

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

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

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

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

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

-アダム

39
Adam Davis

数学では、ベクトルは方向と大きさの組み合わせと考えることができます。ただし、座標と考えることもできます。たとえば、大きさが5で、水平から約37度の角度のベクトルは、2D平面上の点を表します。この点は、デカルト座標ペア(3、4)で表すこともできます。このペア(3、4)も数学的なベクトルです。

プログラミングでは、この名前「ベクトル」は元々、スカラー数の固定長シーケンスを記述するために使用されていました。長さ2のベクトルは2D平面内の点を表し、長さ3のベクトルは3D空間内の点を表します。長さ100のベクトルは、100次元空間内のポイントを表します(数学者はそのようなことを考えるのに苦労しません)。

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

19
Greg Hewgill

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

7
duffymo

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

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

ベクトルの得意分野:

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

[〜#〜] ref [〜#〜]

4
cgreeno

SICP book から:

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

2

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

2
Adrian Grigore

名前からあなたの混乱を理解することができます(私もそれで混乱していました)。数学的な定義に近い3Dグラフィックスプログラミングのベクターという概念は役に立ちません。数学では、ベクターは任意の長さの1次元行列と考えることができます(長さは座標系の次元数です)。ほとんどのOO言語では、ベクトルは本質的に1次元のマトリックス(配列)であるため、名前です。プログラマーがタスクに使用することを決定しない限り、座標とは何の関係もありません。 (これはめったにありません-私はそれを見たことがないです。)彼らは通常、行列乗算または同様の操作を行うための数学演算子も持っていません。したがって、それらの1次元の性質は、類似性の終点です。他の回答に任せて、OOコンテナーの機能と使用法について説明します。これらのコンテナーには既にハンドルがあります。

2
rmeador

単語「ベクトル」のCSの意味を思い出すのに役立つように、伝えるまたは運ぶことを意味するラテン語のルートvehereを参照すると役立つ場合があります。したがって、ベクターは、一般的に言えば、物を運んだり含んでいます。

0
Ezra Justin Lee

C++のデータ構造に加えて、ベクトルはコードへのポインターの用語でもあります。 F.e.割り込みベクトルは、呼び出される割り込みコードを指します。

0
Azure

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

0

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

また、StroustrupのTourhttp://www.stroustrup.com/Tour.html )の第9章から:

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

したがって、STLベクトルは、同じタイプの値のコレクションです。このように、ベクトル/モジュールの数学的な意味に似ていますが、主な問題は、要素の保存方法です

0
isomorphismes