vector是CPP的强力动态数组,但是很多人的应用只停留在表面,甚至对于用法也只了解一点
这对性能强大的CPP来说绝对是一种浪费,所以今天笔者带大家做做基础工作,了解vector容量管理的四个函数
以及他们之间的联系
简单介绍
-
size()
-
这个函数返回
vector
中当前存储的元素的数量。 -
在你的例子中,由于
vector<int> veci;
是一个新创建的空vector
,veci.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基数,在某些场景中记得转化