这个问题真的很不言自明。我对数学中的向量知之甚少,但我并没有真正看到与 C++ 向量的链接。
16 回答
它被称为向量是因为标准模板库的设计者 Alex Stepanov 正在寻找一个名称来将其与内置数组区分开来。他现在承认他犯了一个错误,因为数学已经使用术语“向量”来表示固定长度的数字序列。C++11 通过引入一个行为类似于数学向量的类“数组”来加剧这个错误。
亚历克斯的教训:每次命名时都要非常小心。
向量的数学定义是集合的成员,集合是特定集合 ( )S
n
中的有序值序列。S
这就是 C++vector
存储的内容。
Bjarne Stroustrup的《C++ 编程语言》节选:
“有人可能会争辩说valarray 应该被称为向量 ,因为它是一个传统的数学向量,并且该向量 应该被称为数组。然而,这不是术语演变的方式。”
该名称来自线性代数,其中向量是只有一列或只有一行的矩阵。
为了补充@MarkRuzon 的出色回应:
Alex 说,为了给现在称为 std::vector 的东西起个名字,他观察到了Scheme和Common Lisp给类似数据结构起的名字。
后来他承认他错了,因为C++向量与数学中的向量无关。
他还说,他将 50 人社区的错误引入了 500 万人的社区,因此错误很可能永远存在。
只是说为什么它可能不被调用array
:因为std::vector
有一个动态大小。从概念上讲,数组的长度是固定的。顺便说一句,下一个 C++ 标准有一个std::array
模板,它的大小是固定的,应该优先于普通数组:
std::array<int, 4> f = { 1, 2, 3, 4 };
这只是名字。C++向量可以很好地(或者甚至更准确)称为动态数组或可调整大小的数组,但这个名称只是简单地选择了。这个向量与数学中的向量不同,因为在数学中向量是任何集合V的成员,因此在这个集合上定义了两个重要的操作: +(向量的加法)和x(向量乘以来自场的标量F ) 并且这些操作满足 8 个公理:
加法的结合性
u + (v + w) = (u + v) + w
加法交换律
u + v = v + u
添加的标识元素
存在一个元素 0 ∈ V,称为零向量,使得 v + 0 = v 对于所有 v ∈ V。
加法的逆元素
对于每个 v ∈ V,存在一个元素 -v ∈ V,称为 v 的加法逆元,使得 v + (-v) = 0
标量乘法与域乘法的兼容性
a(bv) = (ab)v
标量乘法的单位元
1 v = v,其中1表示F中的乘法恒等式。
标量乘法相对于向量加法的分布 </p>
a(u + v) = au + av
标量乘法相对于场加法的分布
(a + b)v = av + bv
C++std::vector
支持所有这些(不是直接支持,而是通过 C++ 特性),因此它可以以某种方式称为向量,但这只是俗语,例如Bjarne Stroustrup 在“C++ 编程语言”Vallaray
中指出的直接支持其中一些。
很久以前,在B 语言中有向量类型。然后 C 语言称它们为“数组”。然后带有类的 C 和 C++ 语言只是派生它...
这当然不是故事的全部。如上所述,斯捷帕诺夫做出了实际决定。但是如果“向量”仍然在 C 中使用,结果可能看起来完全不同。
PS。我想知道为什么 C 重命名“数组”。确切的原因是什么?
PS2。对于 C++ 这样的语言,IMO 更好地表示“一个类型保存元素可以通过 operator[] 合理访问”(即不是 42[some_array_object]),例如将 std::map 实例化为“关联数组”。
向量只是一个值序列,所有类型都相同。这与在数学中的使用非常吻合。我猜向量应该支持一些常见操作(例如加法和标量缩放)的数学思想没有被继承,重要的方面主要是结构。
此外,如果你让它存储整数或浮点数,它确实是存储 N 维向量的绝佳类型。毕竟,向量是按特定顺序保存的数字列表。
但是数学向量不是动态的,我从未见过从 2D 到 3D 或其他任何东西的变化,如果传统数组可以产生更好的向量的话。
我猜它来自术语row vector。此外,计算机科学家喜欢为事物想出新的名字……
将 C++ 向量视为动态数组,可以通过插入或删除元素来更改其大小。它们与向量的数学定义无关。
数学中的向量
考虑一个nxm
称为 的矩阵A
,其中n
对应于行数,m
对应于列数。在数学上下文中,一旦你引入了这样的矩阵,那么以后,你就不能在A
' 范围之外进行任何操作,你也不能扩展A
' 的大小。这意味着您不能引用[n + 1]
和/或的索引[m + 1]
。
现在,一个向量也A
派生了这些属性,而它们的维度将始终是1xm
([i]
在 中选择的任何行A
)或nx1
([j]
在 中选择的任何列A
)。向量也不能指定为2xn
,因为向量的集合不能被解释为一个向量,而一个向量——假设它是 的[i]
列向量,A
维度为1xm
——可以被解释为一个矩阵。
重要的一点是,一旦从数学角度引入向量,就无法更改向量的维度。
C++ 中的向量
在 C++ 中,向量就像数学中的向量,但与数学不同,它们的大小可以更改。大小作为一个术语在这里适用,因为它意味着一个特定向量包含的元素计数。
当您有一个向量向量时,您可以根据 C++ 向量使用术语维度:std::vector<std::vector<T>>> ragged_array
. 在这个例子中,我称这个向量为“ragged”,因为它演示了如何独立改变该向量的每个向量的大小。它不仅违反了一旦在数学中引入特定向量就不能改变维度的规则,而且还证明了它不能用作矩阵。
不知道真正的原因,但 C++ 将其称为向量而不是数组,减少了 C 和 C++ 结构之间的混淆,尽管它们具有相同的作用。
想知道类型的参数化对名称有什么作用..
这里有一个专栏被炸毁了..(查看一些服务器端 ASP.NET HTML 编码技巧的源代码)
还是一排?
话又说回来,在 MIMD 甚至 SSE 向量机上下文中考虑它,这个名字听起来仍然非常好。
它来自由向量构建的矩阵结构