c++里如何理解vector是動態數組,而這個單詞本義是向量?為什麼這麼叫?
初學c++ 向量和數組是什麼關係 為什麼命名要叫vector
轉自stl - Why is a C++ Vector called a Vector?上面的回答原文如下:
翻譯:「之所以選擇這個名字,是因為Alex Stepanov作為C++標準庫的設計者當初在尋找一個可以與內置數組類型區分開來的名字的時候,使用了「向量」這個表示。他現在承認這確實是個錯誤,因為數學家們通常使用「向量」來表示一個定長的序列。C++0X中又引入一個表示定長序列的array類型從而加劇了這個錯誤。所以說,命名的時候一定要非常小心,這是Alex給我們帶來的教訓。」「It"s called a vector because Alex Stepanov, the designer of the Standard Template Library, was looking for a name to distinguish it from built-in arrays. He admits now that he made a mistake, because mathematics already uses the term "vector" for a fixed-length sequence of numbers. Now C++0X will compound this mistake by introducing a class "array" that will behave similar to a mathematical vector.
Alex"s lesson: be very careful every time you name something.」
查了一下,vector 這個術語應該是由威廉·哈密頓爵士(Sir William Rowan Hamilton)在定義四元數(quaternion)的時候所首創的。引用1853年的講義[1]:
他使用拉丁詞 vehere 來發明 vector 這個英文詞。矢量原本是一個幾何物體,本身並不等於一組有序數字,後者是把矢量分解後的表示方式。有答案說,C++的多元組(tuple)才像數學上的矢量。但一般數學上的矢量是在某個域的矢量空間中的元素,通常是或。而多元組裡可以有不同的元素類型,似乎也不是一個合適的對應。不過,C++的std::tuple確實和數學上的多元組非常吻合,都是固定數目、有序、含不同元素類型的構造。
數學上矢量空間中的矢量需要有一些相關的運算,這和程序語言中的「數據結構」並不是同樣的概念。
如果真的要一個較合乎計算機的名字,也許應該稱作動態數組(dynamic array),以區別於固定大小的數組。在C/C++的概念中,數組中的元素只能是一個類型。不然的話,唯有發明一個新詞,以區別其他已有概念。
許多時候,編程語言只是借用一些數學概念,方便學習。但這些概念並不一定是完美的對應。例如知乎上經常有的浮點數問題,本質上就是把浮點數當作是數學中的實數。計算機的整數也不是數學中的整數。
所以,不要太介懷編程語言和數學概念不是完全對應。分別了解兩者就可以了。
[1] Hamilton, William Rowan. Lectures on quaternions. 1853. https://books.google.com.hk/books?id=TCwPAAAAIAAJ
----從 https://en.wikipedia.org/wiki/Dynamic_array 看到,大家已經很努力地命名,但也沒有共識:C++"s std::vector is an implementation of dynamic arrays,
as are the ArrayList class supplied with the Java API and the .NET Framework.The generic List&<&> class supplied with version 2.0 of the .NET Framework is also implemented with dynamic arrays.Smalltalk"s OrderedCollection is a dynamic array with dynamic start and end-index, making the removal of the first element also O(1).Python"s list datatype implementation is a dynamic array.
Delphi and D implement dynamic arrays at the language"s core.Ada"s Ada.Containers.Vectors generic package provides dynamic array implementation for a given subtype.Many scripting languages such as Perl and Ruby offer dynamic arrays as a built-in primitive data type.Several cross-platform frameworks provide dynamic array implementations for C, including CFArray and CFMutableArray in Core Foundation, and GArray and GPtrArray in GLib.
真正是數學上的vector的,應該是cpp11的tuple.
----------------------------
更新:和數學上的Tuple才是一致的。
---------------------------本答案已經自殘,請參閱 @Milo Yip de da"an
C++的vector代表伸縮數組定長的數組要麼是內置數組,要麼是std::array
在計算機的世界中,尤其是計算機圖形中,vector可以認為是個多義詞:既可以表示線性代數中的向量,也可以表示長度固定的數組(也就是項數固定的有序數列),這兩種用法在代碼中都特別常見。而且這兩種解釋更接近向量的本意。
你可以這麼簡單理解。向量的幾何意義是既有大小又有方向的量。向量的代數表示是一個項數固定的有序數列。
然而C++STL中的vector長度(項數)可不是固定的,他表示的是一個變長數組,這樣命名就不準確了。所以,這個名字起的不好。
至於為什麼起這個名字,恐怕要去翻一下當初STL作者有沒有寫過什麼書籍文獻,或者類似回憶錄之類的才能搞清楚。
我個人推測,他這樣命名的原因可能是,向量的長度(length)可以被縮放(scale),大概覺得這樣命名比較形象吧。但是他代碼里用的是size()函數啊,(╯°□°)╯︵ ┻━┻可以好好看看c++中vector的底層實現,可以想像為封裝了一個動態數組,和一些對數組的操作,以實現數組的動態擴展。
壓棧特性是萬物之母,也是萬惡之源。
數學上,N維數組可以看成廣義的N維向量。因為有array數組了,它不能改變大小,所以叫靜態數組;同理,vector就是動態數組。所謂靜態動態只是分配好空間能不能改變大小的問題。array是stack(棧)或者static(靜態)空間,vector是heap(堆)空間。從容量來說一般 heap &> static &> stack訪問速度 array &>= vector
向量就是一個 N 元組,每一維的值表示在當前維度上的映射。這個也很好理解,比如在我們所處的三維世界中,對於一個代表力的矢量,我們可以通過建立空間直角座標系,把它分解為在三個方向上的力,然後用三個數值表示,就是 (x, y, z)。反過來說,一個具有五個元素的數組,就是一個五維空間上的向量在五個維度上映射的數值表示。
推薦閱讀:
※誰能介紹一下清北的信科體驗營的基本情況?
※為什麼埃式篩法的時間複雜度是O(nloglogn)?
※數學基礎課在計算機領域的應用有哪些?
※車萬翔是誰?在他的背後又有哪些傳奇經歷?
※語音處理中MFCC(Mel頻率倒譜係數)對應的物理含義是什麼?它計算出的那幾個係數能反映什麼樣特徵?