这个问题其实不言自明。我对数学中的向量知之甚少,但我并没有真正看到与C++向量的联系。
向量只是一个值序列,所有值都具有相同的类型。这与数学中的用法非常一致。我猜向量应该支持一些常见操作(如加法和标量缩放)的数学思想并没有延续,重要的方面主要是结构。
我猜它来自术语行向量。此外,计算机科学家喜欢为事物想出新的名字……
此外,如果你让它存储整数或浮点,它确实是存储n维向量的优秀类型。毕竟,矢量是一系列按特定顺序排列的数字。
向量的数学定义是集合Sn的成员,它是特定集合(S)中的值的有序序列。这是C++vector存储的内容。
S
n
vector
名称来自线性代数,其中向量是只有一列或只有一行的矩阵。
我不知道真正的原因,但C++称它为向量而不是数组,减少了C和C++结构之间的混淆,尽管它们扮演着相同的角色。
节选自Bjarne Stroustrup的C++程序设计语言:
有人可能会说ValArray 应该被称为向量 因为它是传统的 数学向量与向量 应称为数组。 然而,这不是 术语演变。
只是说为什么它可能不被称为array:因为std::vector有一个动态的大小。数组的长度在概念上是固定的。接下来,顺便说一下,C++标准有一个std::array模板,它的大小是固定的,应该优先于普通数组:
array
std::vector
std::array
std::array<int, 4> f = { 1, 2, 3, 4 };
之所以将其称为向量,是因为标准模板库的设计者Alex Stepanov正在寻找一个名称来将其与内置数组区分开来。他现在承认他犯了一个错误,因为数学已经使用术语“向量”来表示固定长度的数字序列。C++11通过引入一个行为类似于数学向量的类“数组”来加剧这个错误。
亚历克斯的教训:每次你给东西命名的时候都要非常小心。
我想知道类型的参数化对名称的影响..
还是吵架了?
话又说回来,在MIMD甚至SSE Vector Machine上下文中考虑它,这个名字听起来仍然非常好。
它来自于矩阵的结构,矩阵是由向量构成的。
但数学向量不是动态的,我从未见过从2D到3D或其他任何东西的变化,如果有的话,传统的数组可以产生更好的向量。
为了补充来自@MarkRuzon的精彩回复:
Alex说,为了给现在的STD:vector命名,他观察了方案和Common Lisp给类似数据结构所起的名字。
后来他承认自己错了,因为C++向量与数学中的向量毫无关系。
他还说,他把一个50人的社区的错误引入了一个500万人的社区,所以这个错误很可能会永远存在。
很久以前,在B语言中有向量类型。然后C语言称它们为";数组";然后带类的C和C++语言只是派生了它..
这当然不是故事的全部。作为提到了,斯捷潘诺夫做出了实际的决定。但是如果";向量";仍然在C中使用,结果可能看起来很不一样。
PS.我想知道为什么C重命名";数组";确切的原因是什么?
PS2。在我看来,对于像C++这样的语言,数组更好的意思是“一种类型,通过operator[]来合理地访问元素”。(即不是42[some_array_object]),例如将std::map实例化为“关联数组 ”。
operator[]
42[some_array_object]
std::map
这只是名字。C++向量可以很好地(或者甚至更准确地)称为动态数组或可调整大小的数组,但这个名称只是被选中。该向量与来自数学的向量不同,因为在数学中,向量是五的任何集合的成员,使得在该集合上定义了两个重要的运营:+(向量的加法)和X(向量乘以来自域F的标量),并且这些运算动态数组0:
加法的结合性
U+(V+W)=(U+V)+W
加法的交换性
U+V=V+U
加法单位元
存在元素0∈__abc0,称为__abc1,使得对于所有v∈__abc0,V+0=V.
加法逆元
对于每个v∈V,存在一个元素-v∈__abc0,称为V的__abc1,使得V+(-V)=__abc2
标量乘法与字段乘法的兼容性
A(BV)=(AB)V
标量乘法的单位元
1 V=V,其中1表示F中的乘法恒等式。
标量乘法关于向量加法的分配性
A(U+V)=AU+AV
标量乘法关于域加法的分配性
(A+B)V=AV+BV
C++std::vector支持所有这些(不是直接支持,而是通过C++特性支持),因此它可以以某种方式被称为向量,但这只是口语,例如Bjarne Stroustrup在“ C++程序设计语言”中指出的Vallaray直接支持其中的一些。
Vallaray
可以将C++向量看作一个动态数组,其大小可以通过插入或删除元素来更改。它们与矢量的数学定义无关。
数学中的向量
考虑称为A的nxm矩阵,其中n对应于行数,m对应于列数。在数学环境中,一旦你引入了这样一个矩阵,你就不能在A的范围之外做任何运算,也不能扩展A的大小。 这意味着你不能引用[n + 1]和/或[m + 1]的索引。
A
nxm
m
[n + 1]
[m + 1]
现在,A的向量也导出这些属性,而它们的维度将总是1xm(在A内选择的任何[i]行)。 或nx1(在A内选择的任何[j]列)。 向量也不能被指定为2xn,因为向量的集合不能被解释为一向量,而一个向量(假设是A的[i]列向量,其维数为1xm)可以被解释为矩阵。
1xm
[i]
nx1
[j]
2xn
重要的是,你不能改变向量的维数,一旦它在数学上被引入。
C++中的向量
在C++中,向量就像数学中的向量,但不同于数学中的它们的大小可以改变。。大小作为一个术语在这里适用,因为它暗示了一个特定向量所包含的元素计数。
你可以用C++向量中的维度来表示:std::vector<std::vector<T>>> ragged_array。 在这个例子中,我称这个向量为“ ragged ”,因为 它演示了如何独立地改变该向量的每个向量的大小。它不仅违反了在数学中引入特定向量后维数不能改变的规则,而且还证明了它不能用作矩阵。
std::vector<std::vector<T>>> ragged_array
为了补充马克·鲁松的回答,以下是亚历克斯·斯捷潘诺夫在他2015年出版的《从数学到泛型编程》一书中的话:
STL中的__名称ABC0取自早期的编程语言Scheme和Common Lisp.不幸的是,这与这个术语在数学中更古老的含义不一致…这个数据结构应该被称为数组。不幸的是,如果你犯了一个错误…结果可能会持续很长一段时间。
有相当多的好的否定答案,即向量不是一个好名字。我想补充更多的信息,为什么这样称呼它,以及这个词向量是如何在计算行业中使用的。
向量的字面意思是“承运人”。然而,主要意义来自数学用法,意思是:
第二种意义扩展到计算,并且我们有'内存中连续位置的序列'(简明牛津英语词典)。它具有与数组相似的含义,并且我们有这样的术语:
它们是已确定的用法,因此C++中使用向量并没有错。然而,正如斯捷潘诺夫所说(在从数学到泛型编程中,当他谈到命名原则时):
如果有相互冲突的用法,更成熟的用法会胜出。
他真正感到遗憾的是,矢量的这种用法与(更成熟的)数学用法相冲突,一开始就避免这种用法可能会更好。