vector容器:
1.vector基本概念:
vector功能与数组类似,与数组不同的是,vector可以动态扩展。
2.vector构造函数:
vector<T> v; //默认构造函数,创建数据类型T的容器
vector(v.begin(), v.end()); //将v[begin(), end()) 区间中的元素拷贝给本身
vector(n, elem); //将n个elem拷贝给本身
vector(const vector &vec); //拷贝构造函数
vector<int> v1;
vector<int> v2(v1.begin(), v1.end());
vector<char> v3(10, 'a');
vector<int> v4(v1);
3.vector赋值操作:
vector& operator=(const vector& vec); //等号重载
assign(beg, end); //将beg, end之间的数据拷贝赋值给本身
assign(n, elem); //将n个elem拷贝赋值给本身
vector<int> v2;
v2 = v1;
vector<int> v3;
v3.assign(v1.begin(), v1.end());
vector<int> v4;
v4.assign(10, 100);
4.vector容量和大小:
empty( ); //判断容器是否为空
capacity( ); //容器的容量
size( ); //容器中元素的个数
resize(int num); //重新指定容器的长度为num,容器变长,以默认值填充新位置,容器变 //短,超出的元素被删除
resize(int num, elem); //重新指定容器的长度为num,容器变长,以elem填充新位置,容器变短, //超出的元素被删除
void test03()
{
vector<int>v1;
for (int i = 0; i < 10; i++)
{
v1.push_back(i);
}
if (v1.empty())//为真,代表容器为空
{
cout << "v1为空" << endl;
}
else
{
cout << "v1不为空" << endl;
cout << "v1容量为:" << v1.capacity() << endl;
cout << "v1大小为:" << v1.size() << endl;
}
PrintVector(v1);
//重新指定大小
v1.resize(15);
PrintVector(v1);//默认值为0
v1.resize(5);
PrintVector(v1);//后面的被删掉了
}
5.vector插入和删除:
void test04()
{
vector<int>v1;
v1.push_back(10);
v1.push_back(20);
v1.push_back(30);
PrintVector(v1);//10 20 30
v1.pop_back();//10 20 尾部删除
v1.insert(v1.begin(), 100);//100 10 20 指定位置插入
v1.insert(v1.begin(), 2, 50);//50 50 100 10 20 指定位置插入
v1.erase(v1.begin());//50 100 10 20 指定位置删除
v1.erase(v1.begin(), v1.end()); //指定范围删除
v1.clear();//清空所有数据
}
6.vector数据存取:
at(int idx); //返回idx所指的数据
operator[ ]; //下标重载,返回idx所指的数据
front( ); //返回第一个数据
back( ); //返回最后一个数据
void test05()
{
vector<int>v1;
for (int i = 0; i < 10; i++)
{
v1.push_back(i);
}
cout << v1.front() << " " << v1.at(1) << " " << v1[2] << " " << v1.back() << endl;
//0 1 2 9
}
7.vector互换容器:
功能:实现两个容器内元素的互换。
swap(vec); //将vec与本身的元素互换
v1.swap(v2);//交换两个容器的元素
用途:巧用swap可以收缩内存空间:
resize缩小空间后,只是将size减小了,capacity并没有减小,造成了空间浪费。
解决方法:
vector<int>(v1).swap(v1);
原理:vector<int>(v1) --- 匿名对象,按照v的size开辟大小
.swap(v1) --- 将匿名对象和v1交换
8.vector预留空间:
功能:减少vector在动态扩展内存时的扩展次数。
reserve(int len); //容器预留len个元素长度,预留位置不初始化,元素不可访问。
void test07()
{
vector<int>v;
v.reserve(100000);
int num = 0;
int* p = NULL;
for (int i = 0; i < 100000; i++)
{
v.push_back(i);
//查看动态扩展的次数
if (p != &v[0])
{
p = &v[0];
num++;
}
}
cout << num << endl;//1
}