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