zoukankan      html  css  js  c++  java
  • 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();                   返回v的长度

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

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

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

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

    a.erase(a.begin()+i,v.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]

    迭代器

    这是基础用法,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]);
    }
  • 相关阅读:
    CentOS7使用firewalld打开关闭防火墙与端口
    SELinux: Could not downgrade policy file
    CentOS 安装 semanage 命令
    漏洞: RHSA2017:3075: wget security update
    CentOS7增加或修改SSH端口号
    gnl's not lao 道德经 英文版
    当代 IT 大牛排行榜
    当代 IT 大牛排行榜
    2008 年个人回忆与总结
    Patch2 for NetBeans IDE 6.5 Now Available
  • 原文地址:https://www.cnblogs.com/wzx-RS-STHN/p/12939459.html
Copyright © 2011-2022 走看看