*点击

STL系列:vector入门

Vctor

大家都知道有些题只开单纯的数组实在太难写了,

所以$STL$是一个非常好的东西;

先介绍一下$vector$:

$vector$可以支持迅速的随机访问,但$vector$一般都在末尾进行删减;

 

一般代码操作

#include<vector>     头文件,万能头是包含的

vector<int> a;          定义一个$int$型的$vector$

a.push_back();        在末尾加上一个数

a.pop_back();          删去末尾一个数

a.clear();                  清空$vector$

a.empty();                判断$vector$是否为空,如果是返回$true$,否则$false$

a.size();                   返回$vector$的长度

a.capacity()             预分配的内存空间

a.insert();                任意位置插入元素

a.erase();                任意位置删除元素

a.insert(a.begin()+i,a);                  在第$i+1$个元素前面插入$a$

a.erase(a.begin()+i,a.end()+j);      删除区间$[i,j-1]$,区间从$0$开始

front                返回$vector$的第一个数,示例:$int~b=a.front()$;   等价于$*a.begin()$  和  $a[0]$

back               返回$vector$的最后一个数,示例:$int~b=a.back()$;   等价于$*--a.end()$  和  $a[a.size()-1]$

sort (a.begin(), a.end());    $vector$ 内排序(从小到大);

sort (a.begin(), a.end(), greater<int>());  (从大到小);

 

迭代器

这是基础用法,vector可以用迭代器,这样就减少了访问数组的麻烦

如:

    for(int i=0;i<a.size();i++)

        cout<<a[i]<<endl;

    for(vector<int>::iterator it=a.begin();it!=a.end();it++)

        cout<<*it<<endl;

实际上,上面两个for循环是一样的

 

vector 使用注意事项

 

1,vector是动态数组,灵活性比较好,不需要考虑长度问题,可以减少编程复杂度,使用起来和数组一样方便。

2,vector的做法是:重新开辟一段新的空间,将原空间的数据迁移过去,然后新加入的数据存放在新空间之后并释放掉原有空间。

3,vector的效率远低于数组,在效率要求较高时慎用。

4,如果需要存放的元素有一个不太大的最大值数量,那么大多数时候使用数组会更加简洁。

     因为vector使用起来注意事项太多,即使是熟练的人也很容易出现内存失效之类的错误,这无形中增加了系统维护成本。

 

题目

接下来让我们来看一些水题来更好的理解vector

逆序输出

Description

给你m个整数,将其逆序输出

Input

第一行一个整数m(3 <= m <= 100 ):数的个数 第二行m个整数(空格隔开)(这些数在0-9999999之间)

Output

m个整数(空格隔开)

Sample Input

3
1 7 5

Sample Output

5 7 1
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
vector<ll> a;
inline ll read()
{
    ll a=0,f=1; char c=getchar();
    while (c<'0'||c>'9') {if (c=='-') f=-1; c=getchar();}
    while (c>='0'&&c<='9') {a=a*10+c-'0'; c=getchar();}
    return a*f;
}
int main()
{
    ll n=read();
    for(ll i=1,b;i<=n;i++)
        b=read(),
        a.push_back(b);
    for(ll i=a.size()-1;i>=0;i--)
        printf("%lld ",a[i]);
}

很水的一题,请自行分析

 

数组元素的查找

Description

给你m个整数,查找其中有无值为n的数,有则输出该数第一次出现的位置,没有则输出-1。

Input

第一行一个整数m:数的个数 ( 0 <= m <= 100 ) 第二行m个整数(空格隔开)( 这些数在 0-999999范围内 ) 第三行为要查找的数n

Output

n的位置或-1

Sample Input

4
1 2 3 3
3

Sample Output

3
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
vector<ll> a;
inline ll read()
{
    ll a=0,f=1; char c=getchar();
    while (c<'0'||c>'9') {if (c=='-') f=-1; c=getchar();}
    while (c>='0'&&c<='9') {a=a*10+c-'0'; c=getchar();}
    return a*f;
}
int main()
{
    ll n=read();
    for(ll i=1,b;i<=n;i++)
        b=read(),
        a.push_back(b);
    ll m=read();
    ll flag=0;
    for(ll i=0;i<a.size();i++)
    if(a[i]==m)
    {
        flag=1;
        printf("%lld",i+1);
        break;
    }
    if(!flag)
        cout<<"-1";
}

这一题要访问位置,用迭代器会比较麻烦

 

元素插入有序数组

Description

给你一个整数n和一个数列,这个数列保证从小到大排列,现要求将这个整数n插入到数列中,使新的数列仍然从小到大排列。

n<=100

Input

第一行一个整数n :等待插入的数 第二行一个整数m :数列中数的个数 第三行m个整数(空格隔开)

Output

一行整数:新的数列,数列相邻两个数字用一个空格分开

Sample Input

2
4
1 3 4 5

Sample Output

1 2 3 4 5
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
vector<ll> a;
inline ll read()
{
    ll a=0,f=1; char c=getchar();
    while (c<'0'||c>'9') {if (c=='-') f=-1; c=getchar();}
    while (c>='0'&&c<='9') {a=a*10+c-'0'; c=getchar();}
    return a*f;
}
int main()
{
    ll m=read();ll n=read();
    for(ll i=1,b;i<=n;i++)
        b=read(),
        a.push_back(b);
    ll flag=0;
    for(vector<ll>::iterator it=a.begin();it!=a.end()-1;it++)
    {
        if(!flag&&*it>m)
        {
            printf("%lld ",m);
            flag=1;
        }
        printf("%lld ",*it);
    }
    if(!flag)
    {
        ll aa=a.back();
        if(m>=aa)
            printf("%lld ",aa),
            printf("%lld",m);
        else
            printf("%lld ",m),
            printf("%lld",aa);
        return 0;
    }
    printf("%lld",a.back());
}

这一题我这样写是为了防止最后一个输出的数后面出现空格

 

数组元素的移动

Description

数组元素的移动,把数组的第x个位置的元素先保存起来,然后把x+1到n的元素,依次往前移一位,最后原来的第x个位置的元素放在最后

Input

有三行 第一行有一个整数n(1<=n<=100); 第二行有n个整数 第三行有一个整数x

Output

移动后的数组

Sample Input

8
1 2 3 4 5 6 7 8
1

Sample Output

2 3 4 5 6 7 8 1
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
vector<ll> a;
inline ll read()
{
    ll a=0,f=1; char c=getchar();
    while (c<'0'||c>'9') {if (c=='-') f=-1; c=getchar();}
    while (c>='0'&&c<='9') {a=a*10+c-'0'; c=getchar();}
    return a*f;
}
int main()
{
    ll n=read();
    for(ll i=1,c;i<=n;i++)
        c=read(),
        a.push_back(c);
    ll m=read();ll b=a[m-1];
    for(ll i=m-1;i<a.size()-1;i++)
        a[i]=a[i+1];
    a[a.size()-1]=b;
    for(ll i=0;i<a.size()-1;i++)
        printf("%lld ",a[i]);
    printf("%lld",a[a.size()-1]);
}

 

数组元素的插入

Description

在一个数组的第x个位置插入一个新的数y

Input

有四行 第一行有一个整数n ( 5 <= n <= 10 ) 第二行有n个整数 第三行有一个整数x,为要插入的位置 第四行有一个整数y,为要插入的整数

Output

更新后的数组

Sample Input

5
7 2 3 4 5
2
9

Sample Output

7 9 2 3 4 5
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
vector<ll> a;
vector<ll> b;
inline ll read()
{
    ll a=0,f=1; char c=getchar();
    while (c<'0'||c>'9') {if (c=='-') f=-1; c=getchar();}
    while (c>='0'&&c<='9') {a=a*10+c-'0'; c=getchar();}
    return a*f;
}
int main()
{
    ll n=read();
    for(ll i=1,c;i<=n;i++)
        c=read(),
        a.push_back(c);
    ll x=read(),y=read();
    for(ll i=0;i<x-1;i++)
        b.push_back(a[i]);
    b.push_back(y);
    for(ll i=x-1;i<a.size();i++)
        b.push_back(a[i]);
    for(ll i=0;i<b.size()-1;i++)
        printf("%lld ",b[i]);
    printf("%lld",b[b.size()-1]);
}

 

数组元素的删除

Description

把一个数组的第x个位置的元素删除掉

Input

有三行 第一行有一个整数n 第二行有n个整数 第三行有一个整数x,为要删除的位置

Output

输出更新后的数组

Sample Input

5
1 2 3 4 5 
3

Sample Output

1 2 4 5
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
vector<ll> a;
vector<ll> b;
inline ll read()
{
    ll a=0,f=1; char c=getchar();
    while (c<'0'||c>'9') {if (c=='-') f=-1; c=getchar();}
    while (c>='0'&&c<='9') {a=a*10+c-'0'; c=getchar();}
    return a*f;
}
int main()
{
    ll n=read();
    for(ll i=1,c;i<=n;i++)
        c=read(),
        a.push_back(c);
    ll x=read();
    for(ll i=0;i<x-1;i++)
        b.push_back(a[i]);
    for(ll i=x;i<a.size();i++)
        b.push_back(a[i]);
    for(ll i=0;i<b.size()-1;i++)
        printf("%lld ",b[i]);
    printf("%lld",b[b.size()-1]);
}

 

数组元素的排序

Description

对数组的元素按从小到大进行排序

Input

有两行 第一行有一个整数n( 5 <= n <= 10 ) 第二行有n个整数

Output

输出更新后的数组

Sample Input

8
1 2 3 6 8 7 4 5

Sample Output

1 2 3 4 5 6 7 8
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
vector<ll> a;
inline ll read()
{
    ll a=0,f=1; char c=getchar();
    while (c<'0'||c>'9') {if (c=='-') f=-1; c=getchar();}
    while (c>='0'&&c<='9') {a=a*10+c-'0'; c=getchar();}
    return a*f;
}
int main()
{
    ll n=read();
    for(ll i=1,c;i<=n;i++)
        c=read(),
        a.push_back(c);
    for(ll i=0;i<a.size();i++)
    for(ll j=0;j<a.size();j++)
    if(a[i]<a[j])
    {
        ll c;
        c=a[i];
        a[i]=a[j];
        a[j]=c;
    }
    for(ll i=0;i<a.size()-1;i++)
        printf("%lld ",a[i]);
    printf("%lld",a[a.size()-1]);
}

 

sort(b.begin(), b.end(), greater<int>());

posted @ 2020-05-22 20:04  木偶人-怪咖  阅读(636)  评论(0编辑  收藏  举报
*访客位置3D地图 *目录