回答:
ベクトルの数学的定義は、S
n
特定のセット(S
)内の値の順序付けされたシーケンスであるセットのメンバーです。これはC ++がvector
保存するものです。
std::vector
提供していない、3引数std::vector
の値の順序付けられたシーケンスが適用可能性があるstd::list
、std::deque
、std::basic_string
、など
これは、標準テンプレートライブラリの設計者であるAlex Stepanovが組み込み配列と区別するための名前を探していたため、ベクターと呼ばれています。彼は間違いを犯したことを認めています。なぜなら、数学ではすでに固定長の数列に「ベクトル」という用語を使用しているからです。C ++ 11は、数学的なベクトルと同様に動作するクラス「配列」を導入することで、この間違いをさらに悪化させています。
アレックスのレッスン:何かに名前を付けるときは常に注意してください。
なぜそれがおそらく呼び出されないのかを言うとarray
:std::vector
動的なサイズがあるためです。配列は概念的に長さが固定されています。ちなみに、次のC ++標準にはstd::array
テンプレートがあり、サイズは固定されており、単純な配列よりも推奨されます。
std::array<int, 4> f = { 1, 2, 3, 4 };
std::array
@MarkRuzonからの優れた応答を補足するには:
アレックスは、現在std :: vectorと呼ばれているものに名前を付けるために、SchemeとCommon Lispが同様のデータ構造に付けた名前を観察したと述べました。
後で彼は彼が間違っていたと認めます。なぜならC ++ベクトルは数学のベクトルとは何の関係もないからです。
彼はまた、50人のコミュニティのエラーを500万人のコミュニティに導入したため、エラーは永久に続く可能性が高いと述べています。
名前だけです。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。ここで、1はFの乗法的同一性を示します。
ベクトル加算に関するスカラー倍算の分散性
a(u + v)= au + av
フィールドの加算に関するスカラー倍算の分散性
(a + b)v = av + bv
C ++ std::vector
はそれらすべてを(直接ではなくC ++機能を介して)サポートしているため、何らかの形でベクトルと呼ぶことができますが、それは単なる口語表現であり、たとえばVallaray
、「C ++プログラミング言語」の Bjarne Stroustrup がそれらのいくつかを直接サポートしています。
std::vector
は算術演算をサポートしていないため、これらのプロパティはすべてに対して未定義ですstd::vector
。したがって、a std::vector
はベクトルとしての資格はありません。私はそれを呼んだdynamic_array
か、resizable_array
それが何であるかをあなたに告げるでしょう。
また、整数または浮動小数点を格納する場合は、N次元のベクトルを格納するための優れたタイプになります。結局のところ、すべてのベクトルは、特定の順序で保持される数値のリストです。
0.1
、数学ではどこに格納できないか、この値は実数のセットのメンバーです。Javaプログラミング言語(docs.oracle.com/javase/7/docs/api/java/util/Vector.html)では、ベクトルは「Vectorクラスはオブジェクトの拡張可能な配列を実装します。配列と同様に、整数インデックスを使用してアクセスできます。ただし、ベクターのサイズは、ベクターの作成後にアイテムを追加および削除できるように、必要に応じて拡大または縮小できます。」
昔、B言語にはベクター型があります。その後、C言語はそれらを「配列」と呼びました。次に、クラスを含むCとC ++言語がそれを派生させました...
これは確かにすべてではありません。上記のように、ステパノフは実際の決定を行いました。しかし、「ベクトル」がまだCで使用されている場合、結果はおそらくかなり異なって見えます。
PS。なぜCは「配列」の名前を変更するのでしょうか。正確な理由は何でしたか?
PS2。C ++言語のIMOでは、配列の方が「演算子[]を介して合理的にアクセスされる型保持要素」(つまり、42 [some_array_object]ではない)を意味します。たとえば、「連想配列」としてのstd :: mapのインスタンス化です。
これは、行ベクトルという用語に由来すると思います。また、コンピュータ科学者は物事の新しい名前を考えるのが大好きです...
C ++ベクトルを動的配列と考えてください。そのサイズは、要素を挿入または削除することによって変更できます。それらはベクトルの数学的定義とは関係ありません。
数学のベクトル
nxm
と呼ばれる行列を考えてみます。A
ここでn
、行数と列数にm
対応します。数学的なコンテキストでは、このような行列を導入すると、後で、A
の範囲外の操作を実行したり、A
のサイズを拡張したりすることはできません。つまり、[n + 1]
および/のインデックスを参照することはできません[m + 1]
。
現在、A
これらの属性のベクトルも同様に派生していますが、それらの次元は常に1xm
([i]
内で選択された行A
)またはnx1
([j]
内で選択された列A
)になります。また、ベクトルの2xn
コレクションは1つのベクトルとして解釈できないため、ベクトルをとして指定することはできません。一方、1つのベクトル- の次元を持つの[i]
列ベクトルとすると、行列として解釈できます。A
1xm
重要な注意点は、数学の観点から導入されると、ベクトルの次元を変更できないことです。
C ++のベクター
C ++では、ベクターは数学のベクターと同じですが、数学とは異なり、サイズを変更できます。1つの特定のベクトルに含まれる要素数を意味するため、ここでは用語としてのサイズが適用されます。
ベクトルのベクトルがある場合、次元という用語はC ++ベクトルの観点から使用しますstd::vector<std::vector<T>>> ragged_array
。この例では、そのベクターの各ベクターのサイズを個別に変更する方法を示すため、ベクターを「不揃い」と呼びました。これは、特定のベクトルが数学に導入されると、寸法を変更できないというルールに違反するだけでなく、行列として使用できないことも示しています。
型のパラメータ化が名前に及ぼす不思議。
ここで列が爆発します。(サーバー側のASP.NET HTMLエンコーディングスキルのソースを表示)
またはそれは列でしたか?
次に、MIMDまたはSSEベクターマシンのコンテキストで考えると、名前は今でもすごくいいですね。