1 Vector容器
1.1 vector基本概念
使用需包含头文件
功能:
- vector数据结构和数组非常相似,也称为单端数组
vector与普通数组的区别:
- 不同之处在于数组是静态空间,而vector可以动态扩展
动态扩展:
- 找更大的内存空间,并将原数据拷贝到新空间,释放原空间
- vector容器的迭代器是支持随机访问的迭代器
1.2 vector构造函数
创建vector容器
函数原型:
- vector v ; //使用模板类,默认构造函数
- vector(v.begin(),v.end()); //将[v.begin(),v.end())区间中的元素拷贝给本身
- vextor(n,elem); //将n个elem拷贝给本身
- vector(const vector &v) ; //拷贝构造函数
1.3 vector赋值操作
函数原型:
- vector& operator=(const vector &v); //重载赋值运算符
- assign(v.begin(),v.end()); //将[v.begin(),v.end())区间中的元素赋值给本身
- assign(n,elem); //将n个elem赋值给本身
1.4 vector容量和大小
函数原型:
- empty(); //判断容器是否为空,为空返回1,否则返回0
- capacity(); //返回容器的容量
- size(); //返回容器的大小,即容器中元素的个数
- resize(int num); //重新指定容器的长度为num,若容器变长,则以默认值0填充新位置,如果容器变短,则末尾超过容器长度的元素被删除
- resize(int num,int elem); //重新指定容器的长度为num,若容器变长,则以elem填充新位置,如果容器变短,则末尾超过容器长度的元素被删除
resize特性:长赋值,短截断
1.5 vector插入和删除
函数原型:
- push_back(ele); //尾部插入元素ele
- pop_back(); //删除最后一个元素
- insert(const_iterator pos,ele); //在迭代器指向的位置pos处插入一个元素ele
- insert(const_iterator pos,int count,ele); //在迭代器指向的位置pos处插入count个元素ele
- erase(const_iterator pos); //删除迭代器指向的元素
- erase(const_iterator begin,const_iterator end); //删除迭代器从begin到end之间的元素
- clear(); //删除容器中所有元素
1.6 vector数据存取
函数原型:
- at(int idx); //返回索引idx所指的数据
- operator[]; //返回[]内索引所指的数据
- front(); //返回容器中第一个元素
- back(); //返回容器中最后一个元素
1.7 vector容器互换
函数原型:
- swap(v); //容器v和当前容器互换
实例运用-收缩内存
void test01()
{
vector<int> v1;//默认构造,无参构造
for (int i = 0; i < 100000; i++)
v1.push_back(i);
cout << "v1容量:" << v1.capacity() << endl;
cout << "v1大小:" << v1.size() << endl;
v1.resize(3);
cout << "v1容量:" << v1.capacity() << endl;
cout << "v1大小:" << v1.size() << endl;
//使用v1初始化匿名对象,再用swap互换指针域,语句执行完后,系统自动回收匿名对象指向的内存-以达到收缩内存的目的
//收缩内存
vector<int>(v1).swap(v1);//使用匿名对象
cout << "v1容量:" << v1.capacity() << endl;
cout << "v1大小:" << v1.size() << endl;
}
1.8 vector预留空间
功能:减少vector在动态扩容时的扩展次数
每次使用push_back(v)时,如果容器v的大小要超过v的容量时,系统就会对v进行一次动态扩容,至于扩大多少空间,由系统决定.
函数原型:
- reserve(int len);//容器预留len个元素长度,也就是把容量扩为len,预留的位置并不初始化,同时也不可访问
void test01()
{
vector<int> v1;//默认构造,无参构造
//预留空间
v1.reserve(100000);
int num = 0;
int* p = NULL;
for (int i = 0; i < 100000; i++)
{
v1.push_back(i);
if (p != &v1[0])
{
p = &v1[0];
num++;
}
}
cout << "v1容量:" << v1.capacity() << endl;
cout << "v1大小:" << v1.size() << endl;
cout << "空间开辟次数:" << num << endl;
}