C ++ Vectorがベクターと呼ばれるのはなぜですか?


147

質問は本当に自明です。数学のベクトルについては漠然と知っていますが、C ++ベクトルへのリンクは実際にはわかりません。


5
物理学のベクトル(マグニチュート+方向)は、ベクトルという言葉を聞いた瞬間に最初に頭に浮かぶものです。
RBT 2016

回答:


109

ベクトルの数学的定義は、Sn特定のセット(S)内の値の順序付けされたシーケンスであるセットのメンバーです。これはC ++がvector保存するものです。


21
ベクトルは物理学で使用されるため、通常は2〜3次元と見なされます。しかし、より一般的には、数学では、それらは順序のある数のセットを意味します(数学的セットは順序がなく、詰め物が入ったバッグのようなものです)。ベクトルは任意の数の要素を持つことができます。
ジョセフガービン、

8
vartec、ユークリッドベクトルを座標ベクトルとして表現できませんか?それらは、ユークリッド空間とより一般的なベクトル空間における同じもの(タプル)の異なる表現です。
カルバン

6
@ジョセフ・ガービン:ベクトルは、数値であるコンポーネントを持つ必要さえありません。たとえば、特定の関数セットを使用して、コンポーネントが関数であるベクトル空間を形成できます。
ジェイソン

13
ベクトルは文字通り「キャリア」です。同じ言葉が(例えば)病気を伝染する昆虫に使用され、「乗り物」と同じラテン語の語源に由来します。つまり、ある場所から別の場所へとあなたを連れて行くものです。ちなみに、「マトリックス」という言葉もラテン語で、「子宮」を意味します。
Artelius

6
1.数学ベクトルは次元に変化していない、2数学ベクトルは操作があります。これらは不十分なので、思わstd::vector提供していない、3引数std::vectorの値の順序付けられたシーケンスが適用可能性があるstd::liststd::dequestd::basic_string、など
jamesdlin

188

これは、標準テンプレートライブラリの設計者であるAlex Stepanovが組み込み配列と区別するための名前を探していたため、ベクターと呼ばれています。彼は間違いを犯したことを認めています。なぜなら、数学ではすでに固定長の数列に「ベクトル」という用語を使用しているからです。C ++ 11は、数学的なベクトルと同様に動作するクラス「配列」を導入することで、この間違いをさらに悪化させています。

アレックスのレッスン:何かに名前を付けるときは常に注意してください。


1
ただし、配列はヒープ割り当てを使用しないため、効率的に移動できません。std :: valarray、btwもあります。
sellibitze

1
ヒープに割り当てることができるので、安価な移動が望まれます。

2
手遅れなのに彼らがそのレッスンを学んだことを知ってうれしい。... typedefまたは#defineでも修正できます。
LearnCocos2D 2015

4
コンピュータサイエンスで難しいことは2つだけです。キャッシュの無効化と命名のこと-Phil Karlton
RBT

7
回答で「[アレックスステパノフ]が間違いを認めた」と主張する場合、引用を提供していただけますか?
Trevor Boyd Smith

56

Bjarne StroustrupによるC ++プログラミング言語から抜粋:

「一つは、その主張することができたvalarrayが 呼ばれている必要がありますベクトル 、それは伝統的な数学のベクトルであり、そのため、ベクトルが 呼ばれている必要があります配列。しかし、これは専門用語が進化方法ではありません。」


51
あの男は何を知っているの?私はこの「Bjarne Stroustrup」の人すら聞いたことがありません。
カルバン

5
前のコメントの賛成票の多くが実際にアンダーフローの結果であると
思い

16

名前は線形代数に由来します。ここで、ベクトルは1列または1行のみの行列です。


10

なぜそれがおそらく呼び出されないのかを言うとarraystd::vector動的なサイズがあるためです。配列は概念的に長さが固定されています。ちなみに、次のC ++標準にはstd::arrayテンプレートがあり、サイズは固定されており、単純な配列よりも推奨されます。

std::array<int, 4> f = { 1, 2, 3, 4 };

その新しいC ++標準はまだリリースされていますか?
ヨハネスジェンセン2010年

1
ベクトルもサイズが固定されているため、これはあまり答えにはなりません。ベクトルは純粋な値であり、いくつかの追加の構造とともに抽象的なベクトル空間を形成するセット内の要素です。ベクトルの「サイズを変更する」という概念は完全にナンセンスです。
サラ

@kaiここで混乱があると思います。私は、なぜそれが配列と呼ばれないのかについて単に議論しました。特にvectorと呼ばれる理由を説明しようとはしていません。言語の標準化前のC ++の配列は常に固定サイズであったため、サイズ変更可能なクラスに名前を付けるのはよくありません。std::array
Johannes Schaub-litb 2017

これで、これは答えではなく有効なコメントであると正しく文句を言うことができます。これまでのところ、コメントの最初の半分の文(カンマまで)に同意します。しかし、あなたと@ user12のこれらの有用なコメントが失われるため、私の回答を質問のコメントに移動するのは遅すぎます。
Johannes Schaub-litb

ジレンマを解決するための妥協案として、回答コミュニティwikiを作成しました。これにより、アカウントから得たすべての賛成票と反対票の損失が削除されます。誰かが私の巧妙な変装コメントに感謝したい場合は、この代表的なコメントに賛成することができます。
Johannes Schaub-litb 2017

10

@MarkRuzonからの優れた応答を補足するには:

アレックスは、現在std :: vectorと呼ばれているものに名前を付けるために、SchemeCommon Lispが同様のデータ構造に付けた名前を観察したと述べました。

後で彼は彼が間違っていたと認めます。なぜならC ++ベクトルは数学のベクトルとは何の関係もないからです。

彼はまた、50人のコミュニティのエラーを500万人のコミュニティに導入したため、エラーは永久に続く可能性が高いと述べています。


5

名前だけです。C ++ ベクトルは、動的配列またはサイズ変更可能な配列と非常によく(またはおそらくさらに正確に)呼び出すことができますが、この名前は単に選ばれました。このベクターは、数学でベクトルが任意セットのメンバであるためmethematicsからベクトルと同じではないV二つの重要な存在であるように、操作:このセットで定義されたが、+(ベクトル加算)と、Xフィールドからスカラー、ベクトルの(掛け算F)およびこれらの演算は、8つの公理を満たします。


加算の関連性

u +(v + w)=(u + v)+ w

加算の可換性

u + v = v + u

追加のアイデンティティ要素

要素0∈が存在するVと呼ばれる、ゼロベクトル、すべてのV∈ためのように、V + 0 = V Vは

加算の逆元

すべてのV∈Vの場合、素子-v∈が存在するVと呼ばれる、反数 Vのは、このようなV +は(-v)=その0

スカラー乗算とフィールド乗算の互換性

a(bv)=(ab)v

スカラー倍算の恒等要素

1 v = v。ここで、1Fの乗法的同一性を示します。

ベクトル加算に関するスカラー倍算の分散性  

a(u + v)= au + av

フィールドの加算に関するスカラー倍算の分散性

(a + b)v = av + bv


C ++ std::vectorはそれらすべてを(直接ではなくC ++機能を介して)サポートしているため、何らかの形でベクトルと呼ぶことができますが、それは単なる口語表現であり、たとえばVallaray「C ++プログラミング言語」の Bjarne Stroustrup がそれらのいくつかを直接サポートしています。


3
C ++のコンテナーにはその種の算術が定義されていないため、C ++にはベクターはありません。特にa std::vectorは算術演算をサポートしていないため、これらのプロパティはすべてに対して未定義ですstd::vector。したがって、a std::vectorはベクトルとしての資格はありません。私はそれを呼んだdynamic_arrayか、resizable_arrayそれが何であるかをあなたに告げるでしょう。
user877329

4
または単に「リスト」。しかし、それは誰もが使用するものからです。
LearnCocos2D 2015

1
@ LearnCocos2D、まあ、リストは通常​​、リンクされたリストであると理解されています。実際、C ++標準ライブラリには、リストと呼ばれるコンテナがすでにあります。これは、二重にリンクされたリストです。
Andrej

3

ベクトルは単純に一連の値であり、すべて同じ型です。これは、数学での使用とほぼ一致しています。ベクトルはいくつかの一般的な操作(スカラーによる追加やスケーリングなど)をサポートする必要があるという数学的な考えは引き継がれていません。重要な側面は主に構造です。


数学で「ベクトル」が発生する線形代数では、すべてのベクトルが同じサイズで、すべてが演算に関するものです。線形代数、つまり演算は、数学において一連の数をベクトルにするものです。
E4z9

3

また、整数または浮動小数点を格納する場合は、N次元のベクトルを格納するための優れたタイプになります。結局のところ、すべてのベクトルは、特定の順序で保持される数値のリストです。


これは露骨に誤りであり、それはベクターがen.wikipedia.org/wiki/Vector_space
サラ

@kai他の地域でもこれらの対立が見られます。一部のプログラミング言語の実数は0.1、数学ではどこに格納できないか、この値は実数のセットのメンバーです。Javaプログラミング言語(docs.oracle.com/javase/7/docs/api/java/util/Vector.html)では、ベクトルは「Vectorクラスはオブジェクトの拡張可能な配列を実装します。配列と同様に、整数インデックスを使用してアクセスできます。ただし、ベクターのサイズは、ベクターの作成後にアイテムを追加および削除できるように、必要に応じて拡大または縮小できます。」
Johannes Schaub-litb 2017

ベクトル何であるかについて、それはあなたが使用する定義に依存します。この質問はmath.stackexchange.comではなく、stackoverflow.comで行われたため、ここでは、数学に偏らないアプローチを主張します。
Johannes Schaub-litb

@kai私は、ベクトル空間に関するベクトルの定義に精通しています。私はコンピュータサイエンスの定義にも精通しています。ベクトルとは、メモリ内で隣接する数のリスト、つまり配列にすぎません。ウィキペディアのvectorの曖昧さ回避ページで、1D配列であることを示す1つの意味があることに注意してください。これは、少なくとも70年代から使用されているベクトルプロセッサで使用されているのとまったく同じ意味です。したがって、私が与えた定義は厳密な数学的定義ではありませんが、古いものではありますが、コンピュータサイエンスの定義です。
James Matta

3

昔、B言語にはベクター型があります。その後、C言語はそれらを「配列」と呼びました。次に、クラスを含むCとC ++言語がそれを派生させました...

これは確かにすべてではありません。上記のように、ステパノフは実際の決定を行いました。しかし、「ベクトル」がまだCで使用されている場合、結果はおそらくかなり異なって見えます。

PS。なぜCは「配列」の名前を変更するのでしょうか。正確な理由は何でしたか?

PS2。C ++言語のIMOでは、配列の方が「演算子[]を介して合理的にアクセスされる型保持要素」(つまり、42 [some_array_object]ではない)を意味します。たとえば、「連想配列」としてのstd :: mapのインスタンス化です。


2

これは、行ベクトルという用語に由来すると思います。また、コンピュータ科学者は物事の新しい名前を考えるのが大好きです...


2

しかし、数学的なベクトルは動的ではありません。2Dから3Dへの変更など、従来の配列でより優れたベクトルを実現できるものはありませんでした。


確かに数学的なベクトルは多くの次元で考慮されます。動的であるとは、ベクトルがそのサイズを変更することを意味し、座標を追加または切り捨てることにより、数学的に「このベクトルを次元xで考える」に簡単に対応できます。単純な線形変換では、ベクトルをn次元空間からm次元空間のベクトルにマッピングできます。数学ベクトルは非常に動的です。
4pie0

1

本当の理由はわかりませんが、C ++が配列ではなくベクターと呼ぶことで、CとC ++の構造間の混乱を軽減しますが、同じ役割を果たします。


1

C ++ベクトルを動的配列と考えてください。そのサイズは、要素を挿入または削除することによって変更できます。それらはベクトルの数学的定義とは関係ありません。

数学のベクトル

nxmと呼ばれる行列を考えてみます。Aここでn、行数と列数にm対応します。数学的なコンテキストでは、このような行列を導入すると、後で、Aの範囲外の操作を実行したり、Aのサイズを拡張したりすることはできません。つまり、[n + 1]および/のインデックスを参照することはできません[m + 1]

現在、Aこれらの属性のベクトルも同様に派生していますが、それらの次元は常に1xm[i]内で選択された行A)またはnx1[j]内で選択された列A)になります。また、ベクトルの2xnコレクションは1つのベクトルとして解釈できないため、ベクトルをとして指定することはできません。一方、1つのベクトル- の次元を持つの[i]列ベクトルとすると、行列として解釈できます。A1xm

重要な注意点は、数学の観点から導入されると、ベクトルの次元を変更できないことです。

C ++のベクター

C ++では、ベクターは数学のベクターと同じですが、数学とは異なり、サイズを変更できます。1つの特定のベクトルに含まれる要素数を意味するため、ここでは用語としてのサイズが適用されます。

ベクトルのベクトルがある場合、次元という用語はC ++ベクトルの観点から使用しますstd::vector<std::vector<T>>> ragged_array。この例では、そのベクターの各ベクターのサイズを個別に変更する方法を示すため、ベクターを「不揃い」と呼びました。これは、特定のベクトルが数学に導入されると、寸法を変更できないというルールに違反するだけでなく、行列として使用できないことも示しています。


0

型のパラメータ化が名前に及ぼす不思議。

ここで列が爆発します。(サーバー側のASP.NET HTMLエンコーディングスキルのソースを表示)

またはそれは列でしたか?

次に、MIMDまたはSSEベクターマシンのコンテキストで考えると、名前は今でもすごくいいですね。


-2

それはベクトルから構築する行列の構造から来ています

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.