vector
vector也叫变长数组,即“长度根据需要而自动改变的数组”。
在编写C++程序时使用vector,需要加上以下头文件和语句:
#include<vector>
using namespace std;
1.vector的定义
vector<typename> name;
其中typename指的是类型,name则指变长数组名。在使用时,typename可以是int,double,char等任意的基本类型,也可以是结构体类型,除此之外,还可以是STL标准容器,如vector、set、queue等。举例如下:
vector<int> name1;//定义一个int类型的变长数组
vector<double> name2;//定义一个double类型的变长数组
vetctor<char> name3;//定义一个char类型的变长数组
vector<stru> name4;//定义一个结构体类型的变长数组
vector<vector<int> > name3;//类似于定义一个二维数组,每一个维度都是可变的;为避免编译器将>>识别为移位操作,写为> >.
定义固定长度的vector数组
vector<typename> name[size];
举例如下:
vector<int> array[100];//相当于定义了具有100个变长数组的数组,每一个arr[0]~arr[99]都是一个vector<int>
2.访问vector容器内的元素
(1)可以通过下标访问
例:
#include<cstdio>
#include<vector>
using namespace std;
int main()
{
vector<int> name;
for(int i=0;i<3;i++)
{
name.push_back(6);//注意不要用name[i]=6;name[index]是取元素用的,注入元素用push_back
printf("%d",name[i]);
}
return 0;
}
(2)通过迭代器访问
之前看到迭代器两个字就不想往下看了,听这个名字就感觉很复杂,其实是写的方式比较复杂,道理很简单,将迭代器变量理解为一个指针,每次指向变长数组中的一个元素的地址,要想取出该元素与指针取元素值的方式相同。
定义迭代器的方式为:
vector<typename>::iterator it;
举例:
vector<int>::itarator it;//变长数组定义的是什么类型,前面就写什么
#include<cstdio>
#include<vector>
using namespace std;
int main()
{
vector<int> name;
for(int i=0;i<3;i++)
{
name.push_back(6);//注意不要用name[i]=6;name[index]是取元素用的,注入元素用push_back
}
for(vector<int>::iterator it=name.begin();it<name.end();it++)
{
printf("%d",*it);
}
//因为迭代器和指针的用法相同,也可用下面方法获取name数组的值
vector<int>::iterator it=name.begin();
for(int i=0;i<3;i++)
{
printf("%d",*(it+i));
}
return 0;
}
name.begin()指向的是name数组的第一个元素的地址,name.end指向的是name数组最后一个元素的下一个地址,*(name.begin()+i)等价于name[i]。
3.vector相关函数
(1)push_back(x)
表示向vector数组中添加一个元素x,时间复杂度为O(1)。
用法:
vector<int> arr;
arr.push_back(10);
(2)pop_back()
表示删除vector数组的最后一个元素,时间复杂度O(1)。
用法:
vector<int> arr;
arr.push_back(10);
arr.pop_back();
(3)size()
用来获取vector容器中的元素,返回的数是无符号类型,用%d接收也可以,时间复杂度O(1)。
#include<cstdio>
#include<vector>
using namespace std;
int main()
{
vector<int> name;
for(int i=0;i<3;i++)
{
name.push_back(6);//注意不要用name[i]=6;name[index]是取元素用的,注入元素用push_back
}
printf("%d",name.size());
return 0;
}
(4)clear()
用来清空vector容器中的所有元素,时间复杂度O(N),N为容器中的元素个数。
(5)insert()
insert(it,x)表示向迭代器it指向的位置插入元素x,时间复杂度O(N)
(6)erase()
erase()可以用来删除单个元素和一个区间内的所有元素。时间复杂度O(N);
- 删除单个元素
erase(it);//it为迭代器,即删除迭代器为it处的元素
- 删除一个区间内的所有元素
erase(first,last)即删除[first,last)内的所有元素
#include<cstdio>
#include<vector>
using namespace std;
int main()
{
vector<int> name;
for(int i=0;i<3;i++)
{
name.push_back(6);//注意不要用name[i]=6;name[index]是取元素用的,注入元素用push_back
}
name.erase(name.begin(),name.begin+1);//删除name[0]
for(vector<int>::iterator it=name.begin();it<name.end();it++)
{
printf("%d",*it);//输出1,2
}
return 0;
}
``