vector对象的常用内置函数使用:?
#include<vector> vector<int> a,b; 1.b为向量,将b的0-2个元素赋值给向量a: a.assign(b.begin(),b.begin()+3); 2.a含有4个值为2的元素: a.assign(4,2); 3.返回a的最后一个元素: a.back(); 4.返回a的第一个元素: a.front(); 5.返回a的第i元素,当且仅当a存在: a[i]; 6.清空a中的元素: a.clear(); 7.判断a是否为空,空则返回true,非空则返回false: a.empty(); 8.删除a向量的最后一个元素: a.pop_back(); 9.删除a中第一个(从第0个算起)到第二个元素,也就是说删除的元素从a.begin()+1算起(包括它)一直到a.begin()+3(不包括它)结束: a.erase(a.begin()+1,a.begin()+3); 10.在a的最后一个向量后插入一个元素,其值为5: a.push_back(5); 11.在a的第一个元素(从第0个算起)位置插入数值5: a.insert(a.begin()+1,5); 12.在a的第一个元素(从第0个算起)位置插入3个数,其值都为5: a.insert(a.begin()+1,3,5); 13.b为数组,在a的第一个元素(从第0个元素算起)的位置插入b的第三个元素到第5个元素(不包括b+6) a.insert(a.begin()+1,b+3,b+6); 14.返回a中元素的个数: a.size(); 15.返回a在内存中总共可以容纳的元素个数: a.capacity(); 16.将a的现有元素个数调整至10个,多则删,少则补,其值随机: a.resize(10); 17.将a的现有元素个数调整至10个,多则删,少则补,其值为2: a.resize(10,2); 18.将a的容量扩充至100: a.reserve(100); 19.b为向量,将a中的元素和b中的元素整体交换: a.swap(b); 20.b为向量,向量的比较操作还有 != >= > <= < eg:a==b;
将这20个操作细分,7,15,16,17是关于vector容器的容量和大小的,1,2,20是有关vector的赋值的,6,8,9,10,11,12,13,14是关于vector容器的插入和删除的,3,4是关于vector容器的数据存取操作的,19是关于vector容器的互换容器的,18是关于vector容器的预留空间的。下面先介绍关于vector函数原型及赋值的知识。
?
一.vector函数原型:
1.vector<T> v;//vector函数原型,默认构造,无参构造
2.vector(v.begin(),v.end());//将v[begin(),end())区间中的元素拷贝给本身
3.vector(n,elem);//构造函数将n个elem拷贝给本身
4.vector(const vector&vec);//拷贝构造函数
vector的默认构造(无参构造)的例子:
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
void Printvector(vector<int>&v)
{?? ?for(vector<int>::iterator it=v.begin();it!=v.end();it++)
?? ?printf("%d ",*it);
?? ?printf("\n");?
}
void test04()
{?? ?vector<int> v1;
?? ?
?? ?for(int i=0;i<10;i++)
?? ?{?? ?v1.push_back(i);
?? ?}
?? ?
?? ?Printvector(v1);?
vector<int> v2(v1.begin(),v1.end());//通过区间方式进行构造
Printvector(v2);
vector<int> v3(10,100);//n个elem方式构造
Printvector(v3);
vector<int> v4(v3);//拷贝构造
Printvector(v4);
} ?
?
int main()
{ test04();
return 0;
}
?
?
?二.vector初始化:
1.定义具有10个整型元素的向量:vector<int>a(10);
2.定义具有10个整型元素的向量,且给出的每个元素初值为1:vector<int>a(10,1);
3.用向量b给向量a赋值,a的值完全等价于b的值:vector<int>a(b);
4.将向量b中从0-2(共三个)的元素赋值给a,a的类型为int型:vector<int>a(b.begin(),b.begin+3);
5.?从数组中获得初值: int b[7]={1,2,3,4,5,6,7}; vector<int> a(b,b+7);
三.?对向量a赋值的几种方式:
?
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
void Printvector(vector<int>&v)
{?? ?for(vector<int>::iterator it=v.begin();it!=v.end();it++)
?? ?printf("%d ",*it);
?? ?printf("\n");?
}
void test05()
{?? ?vector<int> v1;
?? ?
?? ?for(int i=0;i<10;i++)
?? ?{?? ?v1.push_back(i);
?? ?}
?? ?
?? ?Printvector(v1);?
vector<int> v2;
v2=v1;
Printvector(v2);//operator =
vector<int> v3;
v3.assign(v1.begin(),v1.end());
Printvector(v3);//assign方法
vector<int> v4;
v4.assign(10,100);
Printvector(v4);//n个elem方式赋值
}
int main()
{ test05();
return 0;
}
//总结:vector赋值方式比较简单,用=或assign均可。
?
?
?
?
四:vector容器的容量和大小
#include<algorithm>
#include<iostream>
#include<vector>
using namespace std;
void Printvector(vector<int>&v)
{ for(vector<int>::iterator it=v.begin();it!=v.end();it++)
? printf("%d ",*it);
? printf("\n");?
}
void test06()
{ vector<int> v1;
?? ?
? for(int i=0;i<10;i++)
?? ?{ v1.push_back(i);
?? ?}
?? ?
?? ?Printvector(v1);?
if(v1.empty())
{ printf("v1为空\n");
}
else
{
printf("v1的容量= \n",v1.capacity());
printf("v1的大小= \n",v1.size());
//resize重新指定大小,若指定的更小,超出部分元素被删除
v1.resize(5);
Printvector(v1);
//resize重新指定大小,若指定的更大,默认用0填充新位置,可以用重载版本替换默认填充
v1.resize(15,10);
Printvector(v1);
}
int main()
{ test06();
return 0;
}
/*总结:empty----判断是否为空
size-----返回元素个数
capacity------返回容器容量
resize--------重新指定大小
*/
五:vector容器的插入和删除
push_back(ele) ;//迭代器指向位置pos插入元素ele
insert(const_iterator pos,ele);//迭代器指向位置pos插入元素ele
insert(const_iterator pos,int count, ele) ; //迭代器指向位置pos插入count个元素ele
erase(const_iterator pos) ;//删除迭代器指向的元素
erase(const_iterator start,const_iterator end);//删除迭代器从start到end之间的元素
clear() ;//删除容器中所有元素
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
void Printvector(vector<int>&v)
{?? ?for(vector<int>::iterator it=v.begin();it!=v.end();it++)
?? ?printf("%d ",*it);
?? ?printf("\n");?
}
void test07()
{
vector<int> v1;
//尾插
v1.push_back(10)
v1.push_back(20)
v1.push_back(30)
v1.push_back(40)
v1.push_back(50)
//遍历
Printvector(v1);
//尾删
v1.pop_back();
Printvector(v1);
//插入(第一个参数是迭代器)
v1.insert(v1.begin(),100);
Printvector(v1);
v1.insert(v1.begin(),2,1000);
Printvector(v1);
//删除(参数也是迭代器)
v1.erase(v1.begin());
Printvector(v1);
//清空(第一种)
v1.erase(v1.begin(),v1.end())
Printvector(v1);
//清空(第二种)(常用)
v1.clear();
Printvector(v1);
}
int main()
{ test07();
return 0;
}
/*总结:push_back----尾插
pop_back-----尾删
insert-------插入
erase--------删除
clear--------清空
*/
六:vector容器的数据存取
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
void test08()
{
vector<int> v1;
for(int i=0;i<10;i++)
{ v1.push_back(i);
}
//用[]方式访问数组元素
for(int i=0;i< v1.size();i++)
{ printf("%d",v1[i]);
}
//用at方式访问数组元素
for(int i=0;i< v1.size();i++)
{ printf("%d",v1.at(i));
}
printf("\n");
//获取第一个元素
printf("第一个元素为: ",v1.front());
//获取最后一个元素
printf("最后一个元素为: ",v1.back());
}
int main()
{ test08();
return 0;
}
/*总结:迭代器、at、[]可以获取vector容器中的元素
front返回容器中第一个元素
back返回容器中最后一个元素
*/
七:vector容器的互换容器
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
void Printvector(vector<int>&v)
{?? ?for(vector<int>::iterator it=v.begin();it!=v.end();it++)
?? ?printf("%d ",*it);
?? ?printf("\n");?
}
void test09()
{
vector<int> v1;
//遍历
for(int i=0;i<10;i++)
{ v1.push_back(i);
}
Printvector(v1);
//逆向输出v1
vector<int> v2;
for(int i=10;i>0;i--)
{ v2.push_back(i);
}
Printvector(v2);
//将v1和v2交换
printf("交换后: \n");
v1.swap(v2);
Printvector(v1);
Printvector(v2);
}
int main()
{ test09();
return 0;
}
八:vector容器的预留空间
功能描述:减少vector在动态扩展容量时的扩展次数。
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
void test10()
{
vector<int> v;
//用reserve预留空间
v.reserve(100000);
int mun=0;//统计开辟空间的次数
int *p=NULL;
for(i=0;i<100000;i++)
{
v.push_back(i);
if(p!=&v[0])//&v[0]是v的首地址
{ p=&v[0];
num++;
}
}
printf("%d\n",num);
}
int main()
{ test10();
return 0;
}
|