vertor push_back 内存地址变化

228 阅读2分钟

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();