code
vector<int> vec = { 1,2,3,4 };
+ &vec[0] 0x009a60f8 {0x00000001} int *
+ &vec[1] 0x009a60fc {0x00000002} int *
+ &vec[2] 0x009a6100 {0x00000003} int *
+ &vec[3] 0x009a6104 {0x00000004} int *
&vec[4] 数组索引超出界限。
// capacity:4 ; size:4
vector.push_back(5)
// e.g: vector 在push后并不会只让容量(capacity)只+1(size,只+1),它会预留出一个或多个同类型大小内存个空间出来。
// capacity :6 ; size:5
+ &vec[0] 0x008e0980 {0x00000001} int *
+ &vec[1] 0x008e0984 {0x00000002} int *
+ &vec[2] 0x008e0988 {0x00000003} int *
+ &vec[3] 0x008e098c {0x00000004} int *
+ &vec[4] 0x008e0990 {0x00000005} int *
&vec[5] 数组索引超出界限。
// vector.capacity() 容量发生改变;
// 虽然容器为6,但是打印索引6时却依旧提示“ 数组索引超出界限。 ”
vector.push_back(6)
// capacity :6 ; size:6
+ &vec[0] 0x008e0980 {0x00000001} int *
+ &vec[1] 0x008e0984 {0x00000002} int *
+ &vec[2] 0x008e0988 {0x00000003} int *
+ &vec[3] 0x008e098c {0x00000004} int *
+ &vec[5] 0x008e0994 {0x00000006} int *
整理
简单理解: 原数组在通过vector.push_back 操作(原始容器大小不足),则会在申请开辟出新的、连续的内存空间,存储变化后的数据|数组 (原始空间被 16进制dd 所填补 )
进一步理解: 一片连续的同类型的内存空间(数组)。该片内存空间的后续内存地址空间可能已被使用,不能直接来使用(push),所以需要开辟一片新的连续空间来存储新的数据(原始数据 + push的内容)
补充: vertor实则是一个class(容量改变,vec内存地址不变(TODO))
总结: vector对象容器值(大小)足够的情况下,进行任何操作,存储数据的内存地址不会发送改变(反之改变)
扩展: push_back(val); insert(index,val); .erase(index); .pop_back(); .end();