为什么C ++ Vector称为Vector?

时间:2009-02-24 11:30:54

标签: c++ stl vector

这个问题真的很明显。我隐约知道数学中的向量,但我并没有真正看到C ++向量的链接。

16 个答案:

答案 0 :(得分:167)

它被称为向量,因为标准模板库的设计者Alex Stepanov正在寻找一个名称,以区别于内置数组。他现在承认自己犯了一个错误,因为数学已经将术语“向量”用于固定长度的数字序列。现在,C ++ 0X将通过引入一个类似于数学向量的类“数组”来复合这个错误。

亚历克斯的教训:每次命名都要非常小心。

答案 1 :(得分:101)

向量的数学定义是集合S n 的成员,它是特定集合(S)中有序的值序列。这就是C ++ vector存储的内容。

答案 2 :(得分:49)

Bjarne Stroustrup的 C ++编程语言的摘录:

  

“人们可以争辩说 valarray   应该被称为 vector   因为它是传统的   数学向量和向量   应该被称为 array 。   但是,这不是这样的   术语演变了。“

答案 3 :(得分:15)

名称来自线性代数,其中向量是矩阵,只有一列或只有一行。

答案 4 :(得分:9)

只是说为什么它可能不会被称为array:因为std::vector具有动态大小。从概念上讲,数组的长度是固定的。顺便提一下,下一个C ++标准有一个std::array模板,它的大小是固定的,应该优先于普通数组:

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

答案 5 :(得分:6)

补充@MarkRuzon的优秀回应:

亚历克斯说,为了给现在称为std :: vector的名字,他观察了SchemeCommon Lisp给予类似数据结构的名称。

后来他承认自己错了,因为C++向量与数学中的向量无关。

他还说,他向一个拥有500万人口的社区引入了一个由50人组成的社区的错误,因此错误可能会永远存在。

答案 6 :(得分:4)

此外,如果你使它存储整数或浮点数,它确实是存储N维向量的绝佳类型。毕竟所有向量都是,按照特定顺序保存的数字列表。

答案 7 :(得分:3)

向量只是一系列值,都是相同的类型。这几乎与数学中的使用一致。我猜测矢量应该支持一些常见操作(例如添加和通过标量缩放)的数学思想不会延续,重要的方面主要是结构。

答案 8 :(得分:3)

很久以前,在the B language中有矢量类型。然后C语言称它们为“数组”。然后带有Classes和C ++语言的C只是派生出来......

这当然不是全部。如上所述,斯捷潘诺夫做出了实际的决定。但是如果C中仍然使用“vector”,结果可能会有很大不同。

PS。我想知道为什么C重命名“数组”。究竟是什么原因?

PS2。对于C ++语言的IMO,数组更好意味着“通过运算符[]”合理访问的类型保持元素(即不是42 [some_array_object]),例如,将std :: map实例化为“关联数组”。

答案 9 :(得分:3)

这只是名字。 C ++ vector 可以很好地(或者甚至更准确)被称为动态数组可调整大小的数组但这个名称只是选择< / strong>即可。此向量与来自数学的向量不同,因为在数学中向量是任何集合 V 的成员,因此有两个重要的操作定义在这个集合: + (添加向量)和 x (向量乘以字段 F 的标量)和这些操作满足8个公理


添加的相关性

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

添加的交换

u + v = v + u

添加的身份元素

存在元素0∈ V ,称为零向量,使得对于所有v∈ V ,v + 0 = 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 ++特性),所以它可以某种方式被称为向量,但它只是口语化,例如Bjarne Stroustrup指出的Vallaray“C ++编程语言”中直接支持其中一些。

答案 10 :(得分:2)

我猜它来自row vector这个词。此外,计算机科学家喜欢为事物想出新的名字......

答案 11 :(得分:1)

不知道真正的原因,但是C ++将其称为向量而不是数组,可以减少C和C ++结构之间的混淆,尽管它们可以完成相同的角色。

答案 12 :(得分:1)

但是数学向量不是动态的,我从未见过从2D到3D或其他任何东西的变化,如果有任何传统的数组用于更好的向量。

答案 13 :(得分:1)

将C ++向量视为动态数组,可以通过插入或删除元素来更改其大小。它们与向量的数学定义无关。

数学向量

考虑名为nxm的{​​{1}}矩阵,其中A对应于行数,n对应于列数。在数学上下文中,一旦你引入这样的矩阵,然后你就不能在m范围之外进行任何操作,你就无法扩展{{1}大小也是。 这意味着您无法引用A和/或A的索引。

现在,[n + 1]的向量也会导出这些属性,而它们的维度始终为[m + 1](在A中选择的任何1xm行 或[i](在A内选择的任何nx1列。 向量也不能指定为[j],因为向量集合不能解释为一个向量,而一个向量 - 让它成为A列向量2xn尺寸为[i]的1}}可以解释为矩阵。

重要的一点是,一旦引入数学,就无法改变向量的维数。

C ++中的向量

在C ++中,向量就像数学中的向量,但与数学不同,它们的大小可以改变。作为术语的大小适用于此,因为它意味着一个特定向量包含的元素计数。

当您有向量向量时,可以使用C ++向量中的术语维度:A。 在这个例子中,我称那个向量&#34;参差不齐&#34;,因为 它演示了该载体的每个载体的大小如何可以独立改变。它不仅违反了数学中引入特定向量后如何不改变维数的规则,而且还证明了它不能用作矩阵。

答案 14 :(得分:0)

想知道类型的参数化会对名称产生影响。

这里 一个 柱 得到           blasted ..(查看某些服务器端ASP.NET HTML编码技巧的来源)

还是一排?

然后再次考虑在MIMD甚至SSE矢量机器环境中,这个名字仍然听起来很棒。

答案 15 :(得分:-2)