STL之vector

vector

使用vector之前,需要定义头文件< vector >,< bits/stdc++.h >万能头中也包含

vector是什么?

简单来说,vector是c++系统库里自带的一种数组,但与一般数组不一样的是,vector的存储方式是动态的,有多少个数要读进来,vector的空间就会扩大

简单模拟一下:

读入1

空间++,总空间扩大

数: 1

下标:0

读入2

空间++,总空间扩大

数: 1 | 2

下标:0 | 1

读入3

空间++,总空间扩大

数: 1 | 2 | 3

下标:0 | 1 | 2

所以我们用vector做题时,不用根据数据范围来开

定义方式:

#include <cstdio>
#include <vector>
using namespace std;
vector <int> a;
int main()
{

     return 0;
}

由此可以看出vector的定义结构:

vector <数据类型> 名称;

接下来介绍vector的各种函数

最基本的读入:

vector的读入并不像普通数组一样scanf(“%d”,&a[i])就行的

而是要用push_back来进行读入

a.push_back(1)

数: 1

下标:0

a.push_back(2)

数: 1 | 2

下标:0 | 1
a.push_back(3)

数: 1 | 2 | 3

下标:0 | 1 | 2

代码实现:

#include <cstdio>
#include <vector>
using namespace std;
vector <int> a;
int main()
{
    for(int i=1;i<=5;i++)
    {
        int x;
        scanf("%d",&x);
        a.push_back(x);
    }
    for(int i=0;i<a.size();i++)
    {
        printf("%d\n",a[i]);
    }
     return 0;
}

输出为:

1

2

3

4

5

由上面的程序珂以看到,vector是可以用size()来查询数组的大小的,就像string一样

所以我们要遍历一遍vector时,size()是很好的选择

#include <cstdio>
#include <vector>
using namespace std;
vector <int> a;
int main()
{
    for(int i=1;i<=5;i++)
    {
        int x;
        scanf("%d",&x);
        a.push_back(x);
    }
    printf("%d\n",a.size());
     return 0;
}

输出:

5

接下来就是a.begin()与a.end()

让我们先模拟出一串数

1 | 2 | 3 | 4 | 5

a.begin()就是第一个数的下标0

a.end()就是a.size(),最后一个数的下标+1

不可直接输出a.begin()和a.end()!

除了size(),还可以用迭代器来遍历vector

迭代器的定义:

vector <int> :: iterator it;

it为名称

#include <cstdio>
#include <vector>
using namespace std;
vector <int> a;
int main()
{
    for(int i=1;i<=5;i++)
    {
        int x;
        scanf("%d",&x);
        a.push_back(x);
    }
    for(int i=0;i<a.size();i++)
    {
        printf("%d\n",a[i]);
    }
    printf("*******\n");
    vector <int> :: iterator it;
    for(it=a.begin();it!=a.end();it++)
    {
        printf("%d\n",*it);
    }
     return 0;
}

输入:

1 2 3 4 5

输出:

1

2

3

4

5


1

2

3

4

5

珂以看到,迭代器与size()没什么两样

注意,迭代器输出不是a[i],是*it

输入输出讲完了,接下来是删除和插入

a.erase( ) 删除

a.insert( , ) 插入

erase

我们来删除下标为4的一格

#include <cstdio>
#include <vector>
using namespace std;
vector <int> a;
int main()
{
    for(int i=1;i<=5;i++)
    {
        int x;
        scanf("%d",&x);
        a.push_back(x);
    }
    a.erase(a.begin()+3);
    //a.insert(a.begin()+3,4);
    for(int i=0;i<a.size();i++)
    {
        printf("%d\n",a[i]);
    }
     return 0;
}

输入:

1 2 3 4 5

输出:

1

2

3

5

珂以看到,a.erase(a.begin()+3)成功删除下标为3的一格,而后面的自动缩进,这就是vector的神奇之处

除了这个,erase还可以删除一个区间

#include <cstdio>
#include <vector>
using namespace std;
vector <int> a;
int main()
{
    for(int i=1;i<=5;i++)
    {
        int x;
        scanf("%d",&x);
        a.push_back(x);
    }
    a.erase(a.begin()+1,a.begin()+3);
    //a.insert(a.begin()+3,4);
    for(int i=0;i<a.size();i++)
    {
        printf("%d\n",a[i]);
    }
     return 0;
}

输入:

1 2 3 4 5

输出:

1

4

5

成功删除了一个区间

注意,是左闭右开[ )

insert

#include <cstdio>
#include <vector>
using namespace std;
vector <int> a;
int main()
{
    for(int i=1;i<=5;i++)
    {
        int x;
        scanf("%d",&x);
        a.push_back(x);
    }
    //a.erase(a.begin()+1,a.begin()+3);
    a.insert(a.begin()+3,4);
    for(int i=0;i<a.size();i++)
    {
        printf("%d\n",a[i]);
    }
     return 0;
}

输入:

1 2 3 4 5

输出:

1

2

3

4

4

5

介系insert,我就不多讲了

好了,今天的vector就说到这,其他有需要我会继续更新的,dalao或julao多多指点

(未经允许禁止转载)


  转载请注明: Mysterious_bird的blog STL之vector

 上一篇
题解 CF902A 【Visiting a Friend】 题解 CF902A 【Visiting a Friend】
此题的思路就是桶排序(也叫小学生排序) 我们只要把传送点-限制地点这其中的所有点都赋一遍值,然后再遍历一遍就行了 而这题需要输入两个相关联的量,所以我就想到了pair pair 一个 std::pair 类型数组,可以存储两个相关联的
2020-04-14
下一篇 
题解 CF701B 【Cells Not Under Attack】 题解 CF701B 【Cells Not Under Attack】
题目分析:这题是给出一个大小为n*n的棋盘,然后在上面放上m个“车”,每个“车”的坐标为Xi和Yi,要你分别算出各个棋子放上去后棋盘上还有多少个安全位置 使用算法:本人一开始看到这篇水题也以为是一道二维模拟题,但看清题目要求后,发现n的
2020-04-10
  目录