码迷,mamicode.com
首页 > 其他好文 > 详细

STL系列:vector入门

时间:2020-05-22 21:41:58      阅读:82      评论:0      收藏:0      [点我收藏+]

标签:逆序   long   clu   iterator   etc   bre   比较   div   mic   

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

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

先介绍一下vector:

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


 

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

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

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

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

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


 

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]);
}

 

 

STL系列:vector入门

标签:逆序   long   clu   iterator   etc   bre   比较   div   mic   

原文地址:https://www.cnblogs.com/wzx-RS-STHN/p/12939459.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!