size,capacity以及resize,reserve详解[more cpp-3]

vector是CPP的强力动态数组,但是很多人的应用只停留在表面,甚至对于用法也只了解一点
这对性能强大的CPP来说绝对是一种浪费,所以今天笔者带大家做做基础工作,了解vector容量管理的四个函数
以及他们之间的联系

简单介绍
  • size()

  • 这个函数返回vector中当前存储的元素的数量。

  • 在你的例子中,由于vector<int> veci;是一个新创建的空vectorveci.size()将返回0,因为没有元素被添加到vector中。

  • capacity()

    • 这个函数返回vector在不进行内存重新分配的情况下可以容纳的元素数量。
    • 容量至少和vector的大小一样大,但可能更大,因为vector通常会预留一些额外的空间以便将来可以快速添加元素,而不需要每次都重新分配内存。
    • 在你的例子中,veci.capacity()的值取决于具体的实现和编译器的行为。有些实现可能会在初始化时预留一定的容量(例如,一些实现可能会默认预留一个小的非零容量),而其他实现可能会从0容量开始。
  • resize()

    • 功能: 修改vector的大小(即元素的数量)。
    • 用法: veci.resize(new_size, value),其中new_size是新的大小,value是可选的,用于填充新增加的元素的值(如果new_size大于原来的size()时)。
    • 效果:
      • 如果new_size小于当前的size()resize()会丢弃多余的元素。
      • 如果new_size大于当前的size()resize()会在末尾添加新元素。如果提供了value,这些新元素将被初始化为value,否则将使用默认构造函数(对内置类型如int,这将是0)。
  • reserve()

    • 功能: 预先分配内存空间,以容纳指定数量的元素。
    • 用法: veci.reserve(new_capacity),其中new_capacity是希望预留的容量。
    • 效果:
    • reserve()不会改变vector的大小,只是改变其容量。
    • 如果new_capacity大于当前的capacity()reserve()将分配更多的内存空间。否则,它不会做任何改变。
    • reserve()通常用于优化性能,通过减少内存重新分配的次数,特别是在知道将要添加大量元素的情况下。
    vector<int> veci;
    veci.reserve(100); // 预留空间以容纳100个元素
    
代码示例
代码示例
	vector<int> veci;
	cout << "生成测试" << endl;
	cout << veci.size() << endl;
	cout << veci.capacity() << endl;
	cout << "-------------------" << endl;
	cout << "reserve测试" << endl;
    //vector是动态数组,增长也需要操作分配空间
	//所以有些大数算法,会在一开始给vetor分配足够的空间,避免运行时分配
	//这样可以加快效率
	veci.reserve(16);
	cout << veci.size() << endl;
	cout << veci.capacity() << endl;
	cout << "-------------------" << endl;
	cout << "resize,空增加测试" << endl;
	veci.resize(4);
	cout << veci.size() << endl;
	cout << veci.capacity() << endl;
	cout << veci << endl;
	cout << "-------------------" << endl;
	cout << "resize,增加指定的元素测试" << endl;
	veci.resize(8, 114);
	cout << veci.size() << endl;
	cout << veci.capacity() << endl;
	cout << veci << endl;
	cout << "-------------------" << endl;
	cout << "resize,删去元素测试" << endl;
	veci.resize(4);
	cout << veci.size() << endl;
	cout << veci.capacity() << endl;
	cout << veci << endl;

运行结果

生成测试
0
0
-------------------
reserve测试
0
16
-------------------
resize,空增加测试
4
16
0 0 0 0

-------------------
resize,增加指定的元素测试
8
16
0 0 0 0 114 114 114 114

-------------------
resize,删去元素测试
4
16
0 0 0 0

总结

总的来说,
capacity和size的关系,好像是仓库和货物的关系,capacity代表容纳能力,size代表实际存入的货物量,如果我们根据预期的货物量,提前建好仓库,对算法效率提升很有帮助

resize()和size()有关系,是直接影响存储的元素个数

reserve()和capacity()有关系,是控制仓库容量的函数

这些函数都是1基数的,而非0基数,在某些场景中记得转化

  • 5
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值