質問は本当に自明です。数学のベクトルについては漠然と知っていますが、C++ ベクトルへのリンクはあまり見当たりません。
16 に答える
標準テンプレート ライブラリの設計者である Alex Stepanov が組み込み配列と区別するための名前を探していたため、ベクトルと呼ばれています。彼は間違いを犯したことを認めています。なぜなら、数学ではすでに固定長の数列に対して「ベクトル」という用語が使用されているからです。C++11 は、数学的ベクトルと同様に動作するクラス「配列」を導入することで、この間違いを悪化させます。
アレックスの教訓: 何かに名前を付けるときは、常に細心の注意を払ってください。
ベクトルの数学的定義はS
n
、特定のセット ( ) 内の値の順序付けられたシーケンスであるセット のメンバーですS
。これは、C++vector
が格納するものです。
Bjarne Stroustrup によるThe C++ Programming Languageからの抜粋:
「valarrayは 伝統的な数学的ベクトルであり、そのvectorはarray と呼ばれるべきだったのでvector と呼ばれるべきだったと主張することができます。しかし、これは用語が進化した方法ではありません。」
この名前は、ベクトルが 1 列または 1 行のみの行列である線形代数に由来します。
おそらく呼び出されない理由を言うと、動的なサイズがあるarray
ためです。std::vector
配列は概念的に長さが固定されています。ちなみに、次の C++ 標準にはstd::array
テンプレートがあり、サイズが固定されており、プレーンな配列よりも優先されます。
std::array<int, 4> f = { 1, 2, 3, 4 };
それはただの名前です。C++ベクトルは、動的配列またはサイズ変更可能な配列と呼ばれる可能性が非常に高い (またはより正確かもしれません) が、この名前は単純に選択されました。このベクトルは数学のベクトルと同じではありません。数学ではベクトルは任意の集合Vのメンバーであり、この集合には+ (ベクトルの加算) とx (フィールドからのスカラーによるベクトルの乗算)という 2 つの重要な演算が定義されているためです。F ) であり、これらの操作は 8 つの公理を満たします。
加算の結合性
u + (v + w) = (u + v) + w
足し算の可換性
u + v = v + u
追加の恒等要素
すべての v ∈ Vに対して v + 0 = vとなる、ゼロ ベクトルと呼ばれる要素 0 ∈ Vが存在します。
足し算の逆元
すべての v ∈ V に対して、v + (−v) = 0となる要素 −v ∈ Vが存在し、 v の加法逆元と呼ばれます。
スカラー倍算と体倍算の互換性
a(bv) = (ab)v
スカラー倍算の恒等元
1 v = v、ここで1はFの乗法恒等式を示します。
ベクトル加算に対するスカラー倍算の分配性 </p>
a(u + v) = au + av
体の加算に関するスカラー倍算の分配性
(a + b)v = av + bv
C++std::vector
はそれらのすべてを (直接ではなく、C++ の機能を介して) サポートしているため、どういうわけかベクトルと呼ぶことができますが、それは単なる口語表現であり、たとえば、 「C++ プログラミング言語」Vallaray
で Bjarne Stroustrup が指摘したように、それらのいくつかを直接サポートしています。
昔、B 言語には vector 型がありました。次に、C言語はそれらを「配列」と呼びました。次に、C with Classes と C++ 言語がそれを派生させました...
これは確かにすべてではありません。上記のように、ステパノフは実際の決定を下しました。しかし、「ベクトル」がまだ C で使用されている場合、結果はかなり異なって見えるかもしれません。
PS。なぜCは「配列」の名前を変更するのだろうか。正確な理由は何でしたか?
PS2。C++などの言語のIMOでは、配列は「operator []を介して合理的にアクセスされる要素を保持する型」(つまり、42 [some_array_object]ではない)をより適切に意味します。たとえば、「連想配列」としてのstd::mapのインスタンス化です。
ベクトルは、すべて同じ型の単純な値のシーケンスです。これは、数学での使用とほぼ一致しています。ベクトルがいくつかの一般的な操作 (加算やスカラーによるスケーリングなど) をサポートする必要があるという数学的考え方は引き継がれていないと思いますが、重要な側面は主に構造です。
また、整数または浮動小数点を格納するようにすると、N 次元ベクトルを格納するための優れた型になります。結局のところ、ベクトルは、特定の順序で保持された数値のリストです。
しかし、数学的ベクトルは動的ではありません。2D から 3D またはその他のものへの変更は見たことがありません。
行ベクトルという用語に由来すると思います。また、コンピューター科学者は物事の新しい名前を考えるのが大好きです...
C++ ベクトルは、要素を挿入または削除することでサイズを変更できる動的配列と考えてください。これらは、ベクトルの数学的定義とは関係ありません。
数学におけるベクトル
nxm
と呼ばれる行列を考えます。A
ここでn
、 は行数にm
対応し、列数に対応します。数学的な文脈では、このような行列を導入すると、後で の範囲外で操作を行うことはできず、のサイズA
を拡張することもできません。これは、 and/orA
のインデックスを参照できないことを意味します。[n + 1]
[m + 1]
のベクトルA
はこれらの属性も派生させますが、それらの次元は常に1xm
( 内で選択された任意の[i]
行A
) またはnx1
(内で[j]
選択された任意の列A
) になります。ベクトルを として指定することもできません。これは、ベクトルの集合を1 つのベクトル2xn
として解釈できないためです。一方、1 つのベクトル (次元がの の列ベクトルとする) は行列として解釈できます。[i]
A
1xm
重要なポイントは、ベクトルが数学的に導入されると、ベクトルの次元を変更できないことです。
C++ のベクトル
C++ では、ベクトルは数学のベクトルに似ていますが、数学とは異なり、サイズを変更できます。サイズという用語がここで適用されるのは、1 つの特定のベクトルに含まれる要素数を意味するためです。
ベクトルのベクトルがある場合、C++ ベクトルに関して次元という用語を使用しますstd::vector<std::vector<T>>> ragged_array
。この例では、そのベクトルを「不規則」と呼びました。これは、そのベクトルの各ベクトルのサイズを個別に変更する方法を示しているためです。特定のベクトルが数学に導入されると次元を変更できないという規則に違反するだけでなく、行列として使用できないことも示しています。
本当の理由についてはわかりませんが、C++ が配列ではなくベクトルと呼ぶことで、C と C++ の構造の間の混乱が減りますが、同じ役割を果たします。
型のパラメータ化が名前に影響を与えるのだろうか。
ここで列が爆破されます..(サーバー側のASP.NET HTMLエンコーディングスキルのソースを表示)
それとも列でしたか?
繰り返しになりますが、MIMDまたはSSEベクターマシンのコンテキストでそれを考えると、その名前はまだかなり良いように聞こえます。
ベクトルから構築される行列の構造に由来します