vector是std庫提供的類似於陣列的容器,在使用c語言陣列的時候會遇到限制,陣列大小不能動態擴充套件。
vector就是應對陣列限制的一種支援動態增長容器。
首先看下面的例項
#include
int main(int argc ,char **argv)
(gdb) info locals
vector = , }, _m_start = 0x46ca318,
_m_finish = 0x46ca320, _m_end_of_storage = 0x46ca320}}, }
從gdb中可以看到vector主要由4個變數組成,乙個是記憶體分配器,另外3個是變數位址。
從我個人的理解,vector可以看出乙個棧結構,_m_start是棧基,_m_end_of_storage是棧頂, _m_finish可以看成
vector中的結束位游標。
列印記憶體可以看到,在這段類似棧結構的記憶體當中。連續儲存了我們壓棧的資料。
0x4ef08a8: 0x00000001 0x00000002 0x00000003 0x00000021
0x4ef08b8: 0x00000000 0x00000000 0x00000000 0x00000000
同時,由於vector是連續記憶體段,所以在使用迭起器的時候,需要注意迭起器失效的問題。
並且vector是非執行緒安全的介面,所以使用時也主要保護。
list是資料結構中的鍊錶的實現,看如下例項
#include
int main(int argc ,char **argv)
(gdb) info locals
the_list = , },
_m_node = }}, }
可以看到上面節點資料中,儲存了前乙個節點和後乙個節點的記憶體位址。
列印前後記憶體位址可以得到當前節點的第三位是壓入的data資料。
(gdb) x /8xw 0x4f670e8
0x4f670e8: 0x04f31e20 0x3c1d2da0 0x00000001 0x00000059
0x4f670f8: 0x01139cf0 0x04f683e0 0x00000005 0x04f68938
(gdb) x /8xw 0x4f8a408
0x4f8a408: 0x3c1d2da0 0x04f96c40 0x00000004 0x00000059
0x4f8a418: 0x00000000 0x00000030 0x04f89d30 0x04f8a4c8
(gdb) x /8xw 0x04f96c40
0x4f96c40: 0x04f8a408 0x04f31e20 0x00000003 0x00000029
0x4f96c50: 0x0000000a 0x0000000a 0x00000000 0x7473696c
(gdb) x /8xw 0x04f31e20
0x4f31e20: 0x04f96c40 0x04f670e8 0x00000002 0x00000011
0x4f31e30: 0x04f30048 0x04f11e50 0x00000010 0x00000019
並且最後乙個節點指向了第乙個資料,形成閉環。
list容器和vector一樣,是非執行緒安全庫,多執行緒使用時請注意資料同步
list和用vector區別
list和用vector區別 stl提供了三個最基本的容器 vector,list,deque vector和 built in 陣列類似,它擁有一段連續的記憶體空間,並且起始位址不變,因此它能非常好的支援隨即訪問,即 操作符,但由於它的記憶體空間是連續的,所以在中間進行插入和刪除會造成記憶體塊的拷...
list和用vector區別
stl提供了三個最基本的容器 vector,list,deque。vector和built in陣列類似,它擁有一段連續的記憶體空間,並且起始位址不變,因此它能非常好的支援隨即訪問,即操作符,但由於它的記憶體空間是連續的,所以在中間進行插入和刪除會造成記憶體塊的拷貝,另外,當該陣列後的記憶體空間不夠...
list和vector的區別
vector和built in陣列類似,它擁有一段連續的記憶體空間,並且起始位址不變,因此它能夠非常好的支援隨機訪問,即操作符,但由於它的記憶體空間是連續的,所以在中間進行插入和刪除會造成記憶體塊的拷貝。另外,當該陣列後的記憶體空間不夠時,需要重新申請一塊足夠大的記憶體並進行記憶體的拷貝。這些都大大...