C++ STL标准模板库——vector
vector基本概念
vector的数据结构和数值非常相似,也称为单端数组,不同之处在于数组是静态空间,而vector可以动态扩展。
动态扩展:并不是在原空间之后续接新空间,而是找更大的内存空间,然后将原数据拷贝新空间,释放原空间。
vector容器的迭代器是支持随机访问的迭代器。即 v.begin()+i 迭代器可以这样访问
#include<vector> 使用时要加头文件
void myprintf(vector<int> &v)
{
for (vector<int>::iterator it = v.begin(); it < v.end(); it++)
{
cout << *it << " ";
}
cout << endl;
}
vector构造函数
函数原型:
- vector v; //默认构造函数
- vector(v.begin(),v.end()); //将v.begin()和v.end()区间的元素拷贝给本身
- vector(n,elem); //构造函数将n个elem元素拷贝给本身
- vector(const vector & vec); //拷贝构造函数
例子:
vector<int> v;
v.push_back(1);
v.push_back(2);
v.push_back(3);
v.push_back(4);
v.push_back(5);
vector<int> v1(v);
vector<int> v2(v.begin(), v.end());
vector<int> v3(6,10);
vector 赋值操作
有两种方式:操作符= 和 assign()
- assign(v.begin(),v.end()); //将区间[v.begin(),v.end()]的数据拷贝给本身
- assign(n,elem); //将n个elem元素拷贝给本身
例子:
vector<int> v;
v.push_back(1);
v.push_back(2);
v.push_back(3);
v.push_back(4);
v.push_back(5);
vector<int> v1;
v1 = v;
vector<int> v2;
v2.assign(v1.begin(),v1.end());
vector<int> v3;
v3.assign(6,9);
vector容量和大小
函数原型:
- empty(); //判断容器是否为空
- capacity(); //容器的容量
- size(); //返回容器中元素的个数
- resize(int num); //将容器的容量改为num,若容器变长,则以默认值0填充新位置;若容器变短,则末尾超出容量长度的元素被删除
- resize(int num,elem); //将容器的容量改为num,若容器变长,则以elem元素填充新位置;若容器变短,则末尾超出容量长度的元素被删除
例子:
vector<int> v;
v.push_back(1);
v.push_back(2);
v.push_back(3);
v.push_back(4);
v.push_back(5);
v.resize(7,9);
if (v.empty())
{
cout << "v为空" << endl;
}
else
{
cout << "V的容量为:" << v.capacity() << endl;
cout << "V的大小为:" << v.size() << endl;
}
vector插入和删除
函数原型:
- push_back(elem); //尾部插入元素elem
- pop_back(); //删除最后一个元素
- insert(const_iterator pos,elem); //迭代器指向位置pos插入元素elem
- insert(const_iterator pos,int n,elem); //迭代器指向位置pos插入n个元素elem
- erase(const_iterator pos); //删除迭代器指向位置pos元素
- erase(const_iterator begin,const_iterator end); //删除迭代器从begin到end区间上的元素
- clear(); //删除容器所有元素
例子:
vector<int> v;
v.push_back(1);
v.push_back(2);
v.push_back(3);
v.push_back(4);
v.push_back(5);
myprintf(v);
v.pop_back();
v.pop_back();
v.insert(v.end(),9);
v.insert(v.end(),3, 8);
v.erase(v.begin());
v.erase(v.end()-1);
v.erase(v.begin(),v.end());
v.clear();
vector数据的存取
有两种方式:操作符= 和 .at()
- front(); //返回容器中第一个元素
- back(); //返回容器中最后一个元素
例子:
vector<int> v;
v.push_back(1);
v.push_back(2);
v.push_back(3);
v.push_back(4);
v.push_back(5);
for (vector<int>::iterator it = v.begin(); it < v.end(); it++)
{
cout << *it << " ";
}
for (int i = 0; i < v.size(); i++)
{
cout << v[i] << " ";
cout << v.at(i) << " ";
}
cout << endl;
cout << v.front() << " ";
cout << v.back() << " ";
vector互换容器
实现两个容器间的元素互换
函数原型:
- swap(vec); //将vec与本身元素互换
vector<int> v;
v.push_back(1);
v.push_back(2);
v.push_back(3);
v.push_back(4);
v.push_back(5);
vector<int> v1;
for (int i = 10; i > 5; i--)
{
v1.push_back(i);
}
cout << "交换后" << endl;
v.swap(v1);//V和V1交换数值
myprintf(v);
myprintf(v1);
vector预留空间
作用:减少vector在动态扩容时的扩展次数
函数原型;
- reserve(int len); //容器预留len个元素长度,预留位置不初始化,元素不可访问。
例子:
让num记录容器扩容的次数,如果没有v.reserve(1000);这句代码,容器扩容18次,即num=18;如果有v.reserve(1000);这句代码,容器扩容1次,即num=1,即一步到位
int num = 0;
int * d = NULL;
vector<int> v;
v.reserve(1000);
for (int i = 0; i < 1000; i++)
{
v.push_back(i);
if (d!=&v[0])
{
d = &v[0];
num++;
}
}
cout << num << endl;