Standard Template Library
最近开始学习stl库中 的一些容器,主要是为了方便比赛时使用,stl可以大大提高效率,简化代码。这一篇我们开始学习vector动态数组。
动态数组,顾名思义就是动态的数组,原来的普通数组在定义时他的大小就是确定的,动态数组的大小则是随着元素数量的变化而变化的。
1.头文件
头文件要包含两部分:
#include <vectoer>
using namespace std;
2.定义
vector vecc;
//定义了一个用来保存type型变量的名字叫vec的动态数组
//type可以是int,float,double甚至是自定义的结构体。
3.关于vector的一些操作和函数
- vec.push_back();
//尾部删除操作,为什么是尾部删除操作,因为如果在中间删除,插入涉及大量的元素移动,效率将大大降低。
如果我们想要一个长度为n,每个元素都是1的动态数组,通过一个for循环加上push_back操作当然是可以实现的,其实还有一种更简单的方法,就是声明时,对其进行初始化操作
如下所示:
#include <iostream>
#include <vector>
using namespace std;
#define n 5
int main()
{
vector <int> v1;
vector <int> v2(n,1);
int i = 0;
for(i = 0;i<n;i++)
{
v1.push_back(1);
}
for(i = 0;i<n;i++)
{
printf("%d ",v1[i]);
}
printf("\n");
for(i = 0;i<n;i++)
{
printf("%d ",v2[i]);
}
printf("\n");
//std::cout << "Hello world" << std::endl;
return 0;
}
运行结果是:
1 1 1 1 1
1 1 1 1 1
- vec.size()
//求出动态数组的长度 - vec.pop_back()
//删除最后一个元素 - vec.clear()
//清空动态数组,只是将size变为0,并不释放内存。 - vector().swap(v)
//定义一个空的动态数组将其与v数组交换,交换后的空数组与v之前相同,v则变为空数组,此举相当于将v中元素删除。 - 动态数组的索引与数组类似但注意不要越界访问。
下面看一个综合运用:
#include <iostream>
#include <vector>
using namespace std;
#define n 5
int main()
{
vector <int> vec(n,1);
//将12345插入末尾
int i = 0;
for(i = 1;i<=n;i++)
{
vec.push_back(i);
}
//输出看一下其中的结果
for(i = 0;i<(int)vec.size();i++)
{
printf("%d ",vec[i]);
}
printf("\n");
//vec.clear();
printf("size = %d\n",(int)vec.size());
for(i = 0;i<10;i++)
{
printf("%d ",vec[i]);
}//只是长度变为了0,其中的元素并没有清空,内存并没有释放
printf("\n");
vector <int> v2;
v2.swap(vec); //相当于删除了vec中的元素
for(i = 0;i<(int)v2.size();i++)
{
printf("%d ",v2[i]);
}
printf("\n");
//删除v2中的三个元素,再来观察其他剩下的元素
v2.pop_back();
v2.pop_back();
v2.pop_back();
for(i = 0;i<(int)v2.size();i++)
{
printf("%d ",v2[i]);
}
printf("\n");
return 0;
}
- 二维动态数组
与数组类似就是元素是动态数组的动态数组,它也是一个二维矩阵。
定义: vector <vector > vec2;
还是来看一个样例:
#include <iostream>
#include <vector>
using namespace std;
int main()
{
vector <vector <int> > vec2;
int i = 0;
for(i = 0;i<5;i++)
{
vector <int> x(i+1,1);
vec2.push_back(x);
//千万不要写作vec2[i].push_back();
}
for(i = 0;i<5;i++)
{
int j;
for(j = 0;j<=i;j++)
{
printf("%d ",vec2[i][j]);
}
printf("\n");
}
return 0;
}
输出结果将会是一个直角三角形。
另外二维动态数组在应用时也可以是一维固定,一维动态。