vector扩容机制及扩容后数据地址变化

本文详细解析了STL vector的扩容机制,介绍了size()和capacity()的区别,通过实例展示了如何通过reserve和resize操作改变容量和元素数量,并揭示了扩容后数据地址的变化规律。
摘要由CSDN通过智能技术生成

vector扩容机制及扩容后数据地址变化

vector是STL中的动态数组。和数组不同,数组长度一旦确定就无法改变。而vector是可以灵活增加的。(可以不断地push_back())

1、size() 和capacity()

capacity()返回的是总的容量大小,size()返回的是使用的空间大小,capacity()-size()后就是未使用的空间大小
我们可以通过reserve来改变capacity(),resize()改变size(),如:

    vector<int> customers;
    cout << "***************reserve之后**************" << endl;
    customers.reserve(10);
    cout << "size = " << customers.size() << endl;
    cout << "capacity = " << customers.capacity() << endl;
    cout << "address of customers: " << &customers << endl;
    
    cout << "****************resize之后**************" << endl;
    customers.resize(10);
    cout << "size = " << customers.size() << endl;
    cout << "capacity = " << customers.capacity() << endl;
    cout << "address of customers: " << &customers << endl;

最后得到的结果如下:
在这里插入图片描述

2、扩容机制

当vector中容量不够时,vector就自动会进行扩容。
不同的的编译器实现方式不同,vs中以1.5倍扩容,GCC以2倍扩容。
在扩容时,系统会选择一端更大的内存,将数据从原来的内存拷贝过来,同时释放原有的内存。这时数据存在的地址就发生了改变。我们可以通过&vector[0]的方式来查看数据首地址。
注意对于vector,&vector和&vector[0]是不一样的; 而对于数组,&array与&array[0]是一样的,如:

    vector<int> customers = {1,2,3};
    int a[3] = {1,2,3};
    cout << "vector容器的地址: "<< &customers <<endl;
    cout << "容器内部存的数据的首地址: " << &customers[0] << endl;
    cout << "数组的地址: " << &a << endl;
    cout << "数组内存的数据的首地址: " << &a[0] << endl;

    cout << endl << "**************vector容器扩容*****************" << endl;
    
    customers.push_back(4);
    cout << "vector容器的地址: " << &customers << endl;
    cout << "容器内部存的数据的首地址: " << &customers[0] << endl;

最后得到:
在这里插入图片描述
从结果上可以发现,扩容前后数据的首地址发生了变化,而&vector并没有发生变化。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值