標籤:

c++里有沒有類似python中list的結構?

如題,如果沒有的話,為什麼會沒有呢?python中的list每個元素的類型可以不一樣,並且可以任意增長或縮短,任意添加新元素,為什麼c++里會沒有這種數據結構而定義了許多非常局限的數據結構?比如數組和vector?


你可以把元素類型定義為boost::any,這不是容器要做的事情。


若說數據結構本身的類比,那就是vector

如果說要可以裝不同數據類型,那不是容器本身要管的事情,最簡單的,你弄個vector&,啥都能往裡面塞了


因為python的list講究「大而全」的功能,但C++強調的是「用合適的物件做合適的事情」。

這也和語言的設計方針有關,python並不講求速度,而關注於你用起來是否方便。但C++致力於「Zero-cost Abstraction」,強調「Dont pay for things you dont use」,因此對一個萬金油的容器部件,C++自然是不會提供的,只會給你針對各種常用場景下的不同的高效組件。

如果你想在C++中自己實現一個萬能容器,前面 @vczh 說的很正確,選個合適的容器,裡面放any就好了。


所以為什麼Python可以實現List這樣的結構呢?

我們知道,Python中萬物皆對象,list本身是對象,其創建的對象也是對象,其他的int, string等等都是對象。

我們又知道,Python底層是用C寫的,那麼這些類型對象具體在Python源代碼中是怎麼實現的呢?

這裡貼一個list的源碼(Python 2.7.12):

typedef struct {
PyObject_VAR_HEAD
/* Vector of pointers to list elements. list[0] is ob_item[0], etc. */
PyObject **ob_item;
Py_ssize_t allocated;
} PyListObject;

其他的諸如int啊,string啊,都是類似這樣的結構體。

然後注意上面list這段代碼,有個**ob_item,官方注釋里寫的是它是一個指向元素列表的指針。

什麼意思呢?就是說啊,Python中我們用list時看似是一個完整的對象,實際上它維護了兩塊內存,一塊是list對象本身,另一塊,則是ob_item指向的元素列表,也就是list裡面的那些東西,這兩塊內存是相互獨立的。

然後list對象在被銷毀時,實際上釋放的是ob_item指向的那段內存,至於list的本體,條件允許的情況下會被留下來,這是後話了……

既然list中存儲的對象是一塊列表,列表裡每一個內存地址下又都是Python對象(即類似上面的結構體),它裡面的類型當然不受限制了……

所以,題主要是想實現這樣的結構,照著Python源代碼搞一個就好了唄。

@vczh


這是因為C++和python的從一開始的設計理念就不同。

C++中如果只用問題中的那種大而全的數據結構,在某些情況下,效率會非常低。如果你確實需要這樣的結構,可以使用boost::any或void*指針來作為list的元素,一樣可以實現。


自己實現唄,大不了類型都是void*


往 array 和 vector 里塞 pointer,python 就是這麼乾的


我覺得這是數據類型的問題,不是容器的問題

自己寫一個類型就是了……


推薦閱讀:

本人熟悉window下C/C++開發,windows網路/多線程編程,怎麼快速轉到linux下做開發?
Python 和 C++ 如何選擇?
C++ 有哪些性能分析工具?
C++11引入了哪些讓人難忘的坑?
由於未能創建 Microsoft Visual C# 2015 編譯器......問題?

TAG:Python | C |