这个问题真的很明显。我隐约知道数学中的向量,但我并没有真正看到C ++向量的链接。
答案 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的名字,他观察了Scheme和Common 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)