vector容器:动态数组,单口容器;
动态增长基本原理:当插入新元素的时候,如果空间不足,那么vector会重新申请更大的内存空间,将原空间数据拷贝到新空间,释放旧空间数据,再把新元素插入新申请空间。
v.begin() 返回迭代器,指向第一个元素
v.end() 指向最后一个元素的下一个位置
v.rbegin()指向最后一个元素
v.rend() 指向第一个元素的前一个位置
上面返回值都是指针
v.front() 返回第一个元素的值
v.back() 返回最后一个元素的值
构造vector
vector<int> v1(arr, arr + sizeof(arr)/sizeof(int)); 把arr[]数组赋值给v1;
vector<int> v2(v1.begin(), v1.end()); 复制v1的[begin,end)区间给v2;
vector<int> v3(v2); 将v2赋值给v3;
v.size(); 返回容器元素个数;
v.empty();判断容器是否为空,若为空返回true;
遍历(只介绍常用的两种,还有别的方式)
一、可以采用访问数组元素的类似方式访问vector内部的元素
eg:
for(int i=0; i<v.size(); i++)
cout << v[i];
二、与数组元素的指针访问方式类似,采用迭代器
eg:
vector<int>::iterator it = v.begin();
for(it; it != v.end(); it++)
cout << (*it);
assign函数
void assign(const_iterator first,const_iterator last); 开始和结束的指针;
eg:
v.assign(v1.begin(), v1.end()); 将v1的[begin,end)区间赋值给v;
void assign(size_type n,const T& x = T());
eg:
v.assign(3, 1); 将3个1赋值给v;
一些插入操作
void push_back(const T& x); 尾部插入;
eg:
v.push_back(10); //在尾部插入10;
eg:
vector<int> v;
v.push_back(10); v内元素为10
v.insert(v.begin(), 30); 在begin的位置前插入,插入后v为30、10;
v.insert(v.end(), 40); 在end的位置前插入,注:end为最后一个元素的下一位,
所以插入后v为30、10、40;
v.insert(v.begin(), 3, 2); 在迭代器指向位置插入3个2;
插入后v内元素为2、2、2、30、10、40;
v.insert(v.begin() + 2, 40);
插入第二位置,vector支持随机访问;
迭代器可以直接+2、+3,-2....;
注:在指定位置插入元素会引起数据元素移动,效率低;
重载'='
eg:
vector<int> v;
vector<int> v1;
v1.push_back(3); v1此时元素有3;
v.push_back(1);
v1 = v; v1此时元素为1;
删除操作
v.pop_back(); 删除尾部元素;
v.erase(v.begin()); 删除迭代器指向元素;
v.erase(v.begin(), v.end()); 删除区间;
eg:
假如v内元素为1、2、3、4、5;
v.erase(v.begin()+1, v.begin()+4);
删除后v内元素为1、5;
v.clear(); 删除容器内所有元素;
v.capacity(); 返回容器容量;
可以在定义的时候指定eg:vector<int> v(80); 此时v.capacity()为80;
注:v.size() <= v.capacity();
size是实际个数,capacity是最大容量;
就像数组中 int a[10]; 10是capacity,实际存的个数为size小于等于capacity;
v.resize(num, elem);
重新指定容器容量为num;
若变长,如果没有第二个参数elem,则以默认值(0)填充新位置,否则以elem填充新位置;
若变短,超出部分元素被删除;
注:若容器指定容量,如果num超过最大容量会引起内存自动分配
v.reserve(len);
容器预留len个元素长度;
预留位置不初始化,元素不可访问;
reserve和resize区别:
reserve只修改capacity大小,不修改size大小,只有一个参数表示预留容量大小;
resize既修改capacity大小, 也修改size大小,有两个参数,一个是大小,一个是填充值,默认值为0;
v.swap(v1); v和v1交换,交换了指向的首尾指针和容量指针;
vector中swap做内存收缩:
vector添加元素会自动增长,但是删除元素时不会自动减少
eg:
for(int i=0; i<10000; i++)
v.push_back(i);
此时v.size()=10000, v.capacity()=16384(未指定容量大小时取决于电脑,我的电脑显示16384);
v.resize(10);
此时v.size()=10, v.capacity()=16384;
vector<int>(v).swap(v);
v会根据v内实际元素个数初始化自己,然后进行交换,即vector<int>内存空间指针和v指针的指向发生交换,
初始化完成后,vector<int>内存空间被释放;
vector用sort排序
sort需引入头文件#include <algorithm>
方法:sort(v.begin(), v.end()); //默认从小到大
若vector存入的是结构体或想以其他方式排列可自定义函数cmp
sort(v.begin(), v.end(), cmp);