介绍
vector收录在STL里,是一种特殊的数据结构。它的中文名字叫做“动态数组”或者“不定长数组”,有时也被翻译成“容器”。
说白了,vector就是一个功能强大的数组。
头文件
<vector>
声明
vector <数据类型> 动态数组名
如果你想赋初值,你可以:
vector <int> M(a,b)
->在M里装a个b
vector <int> N(a)
->在N里装a个0
当然你也可以:
vector <int> A
vector <int> B(A)
->一个和A一模一样的动态数组
vector <int> C(B..begin()+l,B.end()-r)
->继承B动态数组下标[l.B.end()-r)的值(注意:下标从0开始,函数用法见下)
注:[l.B.end()-r)是数学中的"左闭右开",意思就是这一数组中包含B里的第l个数,但是不包含B.end()-r这个数
(附上代码,大家可以自己试一下)
#include<iostream>
#include<vector>
using namespace std;
int main()
{
int l,r;
vector <int> A(10);
cout<<"A的长度为"<<A.size()<<endl<<endl;
cout<<"A里的值:"<<endl<<endl;
for(int i=0;i<A.size();i++)
{
A[i]=i;
cout<<'<'<<i<<'>'<<' '<<A[i]<<endl;
}
cout<<endl;
cout<<"接下来将对B进行如下定义:"<<endl<<endl;
cout<<"B(A.begin()+l,A.end()-r)"<<endl<<endl;
cout<<"请输入l=";
cin>>l;
cout<<endl;
cout<<"请输入r=";
cin>>r;
cout<<endl;
vector <int> B(A.begin()+l,A.end()-r);
cout<<"B的长度为"<<B.size()<<endl<<endl;
cout<<endl<<"B里的值:"<<endl<<endl;
for(int i=0;i<B.size();i++)
{
cout<<"<"<<i<<'>'<<' '<<B[i]<<endl;
}
return 0;
}
vector的析构函数
动态数组名.~vector<该数组的数据结构>();
vector的自带函数
我们以vector <int> v;
为例:
(注意:vector的下标从0开始)
1.v.at(i);
返回v[i]的值,当然,你也可以直接写成v[i]
2.v.size();
返回v数组元素的总个数
3.v.front();
返回v数组第一个元素的值
4.v.back();
返回v数组最后一个元素的值
5.v.clear();
清空v数组
6.v.begin();
返回v数组第一个元素的地址
7.v.end();
返回v数组最后一个数之后的地址
8.v.empty();
判断v数组是否为空,是空返回1(true),非空返回0(false)
9.v.swap(v1);
或swap(v,v1);
v1是另一个动态数组,将v和v1的元素交换
10.v.capacity();
返回v数组能够容纳的元素数量
11.v.resize();
将v数组的长度设为k
(附上一段代码,大家可以感受一下)
#include<iostream>
#include<vector>
using namespace std;
int b,j,m,n;
int main()
{
cout<<"请输入v数组的元素个数:";
cin>>n;
vector <int> v(n);
cout<<endl;
cout<<"当前已成功定义v数组"<<endl<<endl;
for(int i=0;i<n;i++)
{
cout<<"请输入第"<<i<<"个元素:";
cin>>v[i];
cout<<endl;
}
cout<<"请输入想要查询的第m个值:";
cin>>m;
cout<<endl;
cout<<"当前动态数组的第m个元素为;"<<v.at(m)<<endl<<endl;
cout<<"当前动态数组共有 "<<v.size()<<" 个元素"<<endl<<endl;
cout<<"当前动态数组的第一个元素为:"<<v.front()<<endl<<endl;
cout<<"当前动态数组的最后一个元素为:"<<v.back()<<endl<<endl;
cout<<"当前动态数组的第一个元素的地址为:"<<v.front()<<endl<<endl;
cout<<"当前动态数组的最后一个元素之后的地址为:"<<v.front()<<endl<<endl;
cout<<"是否要对当前动态数组的长度进行修改?是则输入1,否则输入0:";
cin>>b;
cout<<endl;
if(b==1)
{
cout<<"请输入将要修改成的长度:";
cin>>j;
cout<<endl;
v.resize(j);
}
cout<<"当前动态数组的元素个数为:"<<v.size()<<endl<<endl;
cout<<"当前动态数组的容量为:"<<v.capacity()<<endl<<endl;
cout<<"请输入v1数组的元素个数:";
cin>>n;
cout<<endl;
vector <int> v1(n);
cout<<"当前已成功定义v1数组"<<endl<<endl;
for(int i=0;i<v1.size();i++)
{
cout<<"请输入第"<<i<<"个元素:";
cin>>v1[i];
cout<<endl;
}
cout<<"请输入想要查询的第m个值:";
cin>>m;
cout<<endl;
cout<<"当前动态数组的第m个元素为;"<<v1.at(m)<<endl<<endl;
cout<<"当前动态数组共有 "<<v1.size()<<" 个元素"<<endl<<endl;
cout<<"当前动态数组的第一个元素为:"<<v1.front()<<endl<<endl;
cout<<"当前动态数组的最后一个元素为:"<<v1.back()<<endl<<endl;
cout<<"当前动态数组的第一个元素的地址为:"<<v1.front()<<endl<<endl;
cout<<"当前动态数组的最后一个元素之后的地址为:"<<v1.front()<<endl<<endl;
cout<<"是否要对当前动态数组的长度进行修改?是则输入1,否则输入0:";
cin>>b;
cout<<endl;
if(b==1)
{
cout<<"请输入将要修改成的长度:";
cin>>j;
cout<<endl;
v1.resize(j);
}
cout<<"当前动态数组的元素个数为:"<<v1.size()<<endl<<endl;
cout<<"当前动态数组的容量为:"<<v1.capacity()<<endl<<endl;
cout<<"是否交换v和v1,是则输入1,否则输入0:";
cin>>b;
if(b==1)
{
swap(v,v1);
cout<<"v1数组里的元素为:"<<endl<<endl;
for(int i=0;i<v.size();i++)
{
cout<<v[i]<<' ';
}
cout<<"v1数组里的元素为:"<<endl<<endl;
for(int i=0;i<v1.size();i++)
{
cout<<v[i]<<' ';
}
}
cout<<endl;
cout<<"感受完函数的使用你也快快去尝试一下吧O( ∩ _ ∩)O~" ;
return 0;
}
vector的插入
std库提供了好几种插入,这里讲最为常用的三种
1.v.pusb_back(a);
在v数组的尾部插入数a
2.v.insert(v.begin()=k,a)
在下标k的前面插入数a
3..insert(v.begin()+k,p,a)
在下标k前面插入p个a
vector的删除
1.v.pop_back()
删除最后一个元素
2.v.erase(v.begin()+k)
删除下标为k的数,返回下一个位置的下标
3.v.erase(v.begin()+l,v.end()-r)
删除下标[l,v.end()-r)的元素
vector的内存机制
给大家几个规律:
1.设当前v.capacity()=c,v.size()=s;
如果s=c+1,那么c就会加倍。
2.当动态数组内的元素比动态数组长度多一时,动态数组长度翻倍!
3.求vector最多能装多少个元素,我们可以用函数:v.max_size();
来得到。
下列是一个常用的数据结构对应的max_size()
;
bool -> 4294967295
char -> 4294967295
int-> 1073741823
unsigned int -> 1073741823
float -> 1073741823
double-> 536870911
long long -> 536870911
unsigned long long ->536870911
string类型的vector
我们有的时候会看到把vector写成二维数组的形式,比如ops[i][j],i就代表这是vector里的第i个元素,而j就代表这是vector里第i个元素的第j个字符
#include<iostream>
#include<vector>
#include<string>
using namespace std;
int main()
{
vector<string> s;
string str;
int n;
cin>>n;
for(int i=0;i<n;i++)
{
cin>>str;
s.push_back(str);
}
for(int i=0;i<s.size();i++)
{
cout<<s[i]<<endl;
for(int j=0;j<s[i].size();j++)
{
cout<<s[i][j]<<' ';
}
cout<<endl;
}
return 0;
}