1. 容器大小相关函数
容器大小相关函数 | 描述 |
---|---|
c.size() | c的元素个数 |
c.max_size() | c可保存的最大元素个数 |
c.resize(n) c.resize(n,t) | 调整c的元素个数为n,对于多出的元素进行值初始化 调整c的元素个数为n,对于多出的元素使用t来进行初始化 |
c.capacity() | 不重新分配内存空间的话,c可保存的元素个数 只适用于vector、string |
c.reverse(n) | 分配至少能容纳n个元素的内存空间 只适用于vector、string |
c.shrink_to_fit() | 将capacity()减少到size() 只适用于vector、string、deque |
2. 实例
2.1 size()、max_size()和capacity()
// 编译环境:MinGW
#include <iostream>
#include <vector>
using namespace std;
int main()
{
vector<int> v;
cout << "size max_size capacity" << endl;
for (int i = 1; i < 10; ++i)
{
v.push_back(i);
cout << " " << v.size() << " " << v.max_size() << " " << v.capacity() << endl;
}
return 0;
}
分析:
- 当size()==capacity()时,若插入元素,capacity()=capacity()*2。
- capacity()是不重新分配内存空间情况下c可保存的元素个数,其值可改变;max_size()是可重新分配内存空间情况下c可保存的最大元素个数,其值是固定的。
2.2 resize()
// 编译环境:MinGW
#include <iostream>
#include <vector>
using namespace std;
void show(vector<int> v);
int main()
{
vector<int> v{1, 2, 3};
show(v);
v.resize(4); //size()<4,添加1个元素,对其值初始化;capacity<4,vector被重新分配内存
show(v);
v.resize(5, 10); //size()<5,添加1个值为10的元素;capacity<5,vector被重新分配内存
show(v);
v.resize(5); //size()==5,则什么也不做
show(v);
v.resize(2); //size()>2,丢弃多出的元素;capacity>2,丢弃多分配的内存
show(v);
return 0;
}
void show(vector<int> v)
{
cout << "size: " << v.size() << "\ncapacity: " << v.capacity() << endl;
cout << "vector: ";
for (auto a : v)
{
cout << a << " ";
}
cout << endl
<< endl;
}
分析:
- 对于v.resize(n),若n>size(),则添加多出的元素,并进行值初始化;若n==size(),则什么也不做;若n<size(),则丢弃多出的元素。
- 对于v.resize(n,t),若n>size(),则添加多出的的元素,其值为t;若n==size(),则什么也不做;若n<size(),则丢弃多出的元素。
- resize改变时会自动修改容器的容量,使capacity()=size()。
2.3 reserve()
// 编译环境:MinGW
#include <iostream>
#include <vector>
using namespace std;
void show1(vector<int> v);
void show2(vector<int> &v);
int main()
{
vector<int> v{1, 2, 3};
cout << "size: " << v.size() << "\ncapacity: " << v.capacity() << endl
<< endl;
v.reserve(1); //1<capacity(),reserve不会改变capacity
cout << "size: " << v.size() << "\ncapacity: " << v.capacity() << endl
<< endl;
v.reserve(3); //3=capacity(),reserve不会改变capacity
cout << "size: " << v.size() << "\ncapacity: " << v.capacity() << endl
<< endl;
v.reserve(10); //10>capacity(),reserve令capacity=10
cout << "size: " << v.size() << "\ncapacity: " << v.capacity() << endl
<< endl
<< "-------------------------------------" << endl;
//传递普通参数时,实际是将实参拷贝给形参,故v只将其3个元素拷贝给形参,预先分配的空间不会拷贝给形参
show1(v);
//传递引用参数时,实际是形参引用实参,预先分配空间仍在
show2(v);
return 0;
}
void show1(vector<int> v)
{
cout << "size: " << v.size() << "\ncapacity: " << v.capacity() << endl
<< endl;
}
void show2(vector<int> &v)
{
cout << "size: " << v.size() << "\ncapacity: " << v.capacity() << endl
<< endl;
}
分析:
- 对于v.reserve(n),若n<=capacity(),reserve什么也不做;若n>capacity(),reserve才会改变capacity()。
- resize改变size()和capacity(),reserve只改变capacity()。
- 普通形参只会拷贝实参,并分配足量的内存,不会拷贝预先分配的内存;引用形参实际上引用实参,预先分配的内存不变。