说清vector的扩容及size capacity问题

1. vector 扩容

这个没啥好讲的,就是如果满了就扩一倍。

2. capacity和size的意义

vector的有效区域和实际占用的区域是不一样的,这就是因为扩容的存在。capacity存放的是实际占用的空间,size存放的是可以使用的有效空间

例如我在

vector<int>a(3,1);

后,vector的size是3,capacity也是3,但是如果我此时push_back了一下,结果就不一样了,此时的size会是4,但是capacity会是6,这也是正常的。

如果我继续push,直至size和capacity都是6的情况下再push一次,size就会变成7,capacity会是12。

明白了吧。

3. capacity和size的修改

capacity的容量是不允许下降的,只能增长,而修改的函数是reserver。如果修改后的值比目前容器的值要小,修改就会失效

vector<int>a(3,1);
a.push_back(1);
a.reserve(4);///<这句话没用,此时的size还是4,capacity还是6,往上涨是可以的

size的大小可以直接修改,

vector<int>a(3,1);
a.push_back(1);
a.resize(4);
a.resize(10);

那如果我非要修改capacity的大小呢?比如我很在乎扩容的那部分空间。就要利用vector的拷贝构造函数了。vector的拷贝构造函数只会拷贝有效数据,即size的大小,因此swap一下就可以。或者可以直接将capacity缩小至size的大小,shrink_to_fit()

vector<int>a(3,1);
a.push_back(1);
auto b = a;
swap(b, a);///<再查一下a,已经变了
vector<int>().swap(a);///<这个写法很ne,说是和上面auto+swap效果相同,别的地方也没见过这么写的

clear用于清除size内存,capacity是清不掉的

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
C++中的vector是一种动态数组,它可以根据需要自动扩容。当vector中的元素数量超过当前容量时,vector重新分配一块更大的内存空间,并将原有元素复制到新的内存空间中。vector扩容机制可以通过reserve()和capacity()函数来观察和控制。 以下是一个示例代码,演示了vector扩容机制: ```c++ #include <iostream> #include <vector> int main() { std::vector<int> vec; std::cout << "Initial capacity: " << vec.capacity() << std::endl; // 输出:Initial capacity: 0 for (int i = 0; i < 10; i++) { vec.push_back(i); std::cout << "Size: " << vec.size() << ", Capacity: " << vec.capacity() << std::endl; } // 输出: // Size: 1, Capacity: 1 // Size: 2, Capacity: 2 // Size: 3, Capacity: 4 // Size: 4, Capacity: 4 // Size: 5, Capacity: 8 // Size: 6, Capacity: 8 // Size: 7, Capacity: 8 // Size: 8, Capacity: 8 // Size: 9, Capacity: 16 // Size: 10, Capacity: 16 vec.reserve(20); std::cout << "Size: " << vec.size() << ", Capacity: " << vec.capacity() << std::endl; // 输出:Size: 10, Capacity: 20 return 0; } ``` 在上面的代码中,我们首先创建了一个空的vector,并输出了它的初始容量。然后我们通过push_back()函数向vector中添加元素,每次添加一个元素后,都输出当前vector的大小和容量。可以看到,当vector的大小超过当前容量时,vector自动扩容,容量扩大的规则是:如果当前容量不足以容纳新元素,则将容量扩大为原来的两倍。最后,我们使用reserve()函数将vector的容量设置为20,并输出了当前vector的大小和容量。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

tux~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值