zoukankan      html  css  js  c++  java
  • vector的学习(系统的学习)

    首先讲一下vector,vector被称作向量容器,头文件要包括#include<vector>

    可以考虑下面定义:

    vector<int> x;

    vector<char> y;

    x和y分别是整形向量,字符型向量,他们都是空向量

    下面介绍如何使用vector:

    1、vector的初始化:

    int n;

    cin>>n;

    vector<double>d(n),e(n,1.5);

    d和e是两个double型向量,长度和容量都为n,但是d的n个元素被默认置为0,而e的n个元素被置为1.5,可以有下列代码验证

    #include<iostream>
    #include<string.h>
    #include<map>
    #include<cstdio>
    #include<cstring>
    #include<stdio.h>
    #include<cmath>
    #include<ctype.h>
    #include<math.h>
    #include<algorithm>
    #include<set>
    #include<queue>
    typedef long long ll;
    using namespace std;
    const ll mod=1e9+7;
    const int maxn=1e3+10;
    const int maxk=5e3+10;
    const int maxx=1e4+10;
    const ll maxe=1000+10;
    #define INF 0x3f3f3f3f3f3f
    #define Lson l,mid,rt<<1
    #define Rson mid+1,r,rt<<1|1
    int main()
    {
        int n;
        cin>>n;
        vector<double>d(n),e(n,1.5);
        for(int i=0;i<n;i++) cout<<d[i]<<" ";
        cout<<endl;
        for(int i=0;i<n;i++) cout<<e[i]<<" ";
        cout<<endl;
        return 0;
    }

    2、下面介绍size和push_back,front,capacity,pop_back,back等用法

    v.size:返回向量当前长度,也就是元素的个数。

    v.push_back:在向量的尾部添加一个元素,当前长度加一,如果空间不够,则将容量扩大为原先容量的2倍

    v.front:返回向量第一个元素

    v.back:返回向量最后一个元素

    v.capacity:返回向量中最多可容纳的元素数目

    v.pop_back:删除向量的最后一个元素,并且长度减1

    可以由下面代码验证:

    #include<iostream>
    #include<string.h>
    #include<map>
    #include<cstdio>
    #include<cstring>
    #include<stdio.h>
    #include<cmath>
    #include<ctype.h>
    #include<math.h>
    #include<algorithm>
    #include<set>
    #include<queue>
    typedef long long ll;
    using namespace std;
    const ll mod=1e9+7;
    const int maxn=1e3+10;
    const int maxk=5e3+10;
    const int maxx=1e4+10;
    const ll maxe=1000+10;
    #define INF 0x3f3f3f3f3f3f
    #define Lson l,mid,rt<<1
    #define Rson mid+1,r,rt<<1|1
    int main()
    {
        vector<char>v;
        int c=97;
        for(int i=0;i<5;i++) v.push_back(c+i);
        for(int i=0;i<v.size();i++) cout<<v[i]<<" ";//v.size=5,结果是a b c d e
        cout<<endl;
        cout<<v.size()<<" "<<v.capacity()<<endl;//结果是5 8,当前长度是5 可容纳8个元素
        v.pop_back();
        for(int i=0;i<v.size();i++) cout<<v[i]<<" ";//输出结果为a b c d ,因为已经删除最后一个元素了
        cout<<endl;
        cout<<v.front()<<" "<<v.back()<<endl;//结果是a d,第一个元素和最后一个元素
        cout<<v.size()<<" "<<v.capacity()<<endl;//结果是4 8,长度减1,但是容量不变
        return 0;
    }

    3、下面讲一下向量迭代器:iterator

    STL提供成为迭代器的对象,他能够指向一个元素,存取那个元素的值,并能按一种与任何特定容器无关的方法(即一种通用机制)从容器中的一个元素移动到

    另一个元素

    向量的迭代器可以是指向元素的指针p,通过p引用vector中的元,也可以被实现指向向量起点的指针p加上一个位置值index

    为了初始化一个向量迭代器,每个STL容器至少提供两个成员函数:begin(),end()。

    begin():返回迭代器的值,该值是容器第一个元素的位置

    end:返回迭代器的值,该值是容器最后一个元素的下一个的位置

    迭代器的基本操作符:

    ++:将迭代器从当前位置移动到下一个元素的位置,可用前缀操作符,也可做后缀操作符

    --:将迭代器从当前位置移动到前一个元素的位置,可用前缀操作符,也可做后缀操作符

    *:存取迭代器所指的元素
    =:两个相同类型的迭代器it1,it2,执行it1=it2,使得it1也指向it2的位置

    ==:两个类型相同的迭代器it1,it2,若他们指向同一个元素,则it1==it2返回true

    !=:两个类型相同的迭代器it1,it2,若他们指向不同元素,则it1!=it2返回true

    +,-,+=,-=:

    []:对迭代器it及整数n,it[n]返回从it的当前位置向前或向后n个元素的引用

    下面的代码可以验证:

    #include<iostream>
    #include<string.h>
    #include<map>
    #include<cstdio>
    #include<cstring>
    #include<stdio.h>
    #include<cmath>
    #include<ctype.h>
    #include<math.h>
    #include<algorithm>
    #include<set>
    #include<queue>
    typedef long long ll;
    using namespace std;
    const ll mod=1e9+7;
    const int maxn=1e3+10;
    const int maxk=5e3+10;
    const int maxx=1e4+10;
    const ll maxe=1000+10;
    #define INF 0x3f3f3f3f3f3f
    #define Lson l,mid,rt<<1
    #define Rson mid+1,r,rt<<1|1
    int main()
    {
        vector<char>v;
        int c=97;
        for(int i=0;i<5;i++) v.push_back(c+i);
        vector<char>::iterator it1=v.begin(),it2=v.end();//申请两个迭代器,并初始化它们
        for(it1;it1!=it2;it1++) cout<<*it1<<" ";//结果是a b c d e
        cout<<endl;
        it1=v.begin();
        it1+=4;
        it2-=4;
        cout<<*it1<<" "<<*it2<<endl;//结果是e b
        it1++;
        it2--;
        cout<<*it1<<" "<<*it2<<endl;//结果是 a
        cout<<it2[1]<<" "<<it2[-1]<<endl;//结果是 b  输出后面的一个元素,前面的一个元素
        return 0;
    }

    4、下面是向量的插入和删除操作:

    成员函数 push_back、pop_back、back都是在向量尾部进行操作的函数,一般情况下是在向量任何位置进行插入和删除操作,vector完成这些操作的函数有:

    v.insert(it,a):在it指定元素前插入a

    v.insert(it,n,a):在it指定位置前插入n个a

    v.erase(it):删除it指定的位置,返回指定元素的下一个元素的迭代器

    v.erase(it1,it2):删除it1~it2-1之间的所有元素,返回最后一个被删除元素的下一个元素的迭代器

    v.clear():删除所i有元素

    v.reserve(n):向量的容量为n,可以防止在插入和删除的时候向量容量经常发生改变

    v.reverse(it,it+n) :反转it~it+n-1的所有元素

    下面代码可以验证:

    #include<iostream>
    #include<string.h>
    #include<map>
    #include<cstdio>
    #include<cstring>
    #include<stdio.h>
    #include<cmath>
    #include<ctype.h>
    #include<math.h>
    #include<algorithm>
    #include<set>
    #include<queue>
    typedef long long ll;
    using namespace std;
    const ll mod=1e9+7;
    const int maxn=1e3+10;
    const int maxk=5e3+10;
    const int maxx=1e4+10;
    const ll maxe=1000+10;
    #define INF 0x3f3f3f3f3f3f
    #define Lson l,mid,rt<<1
    #define Rson mid+1,r,rt<<1|1
    int main()
    {
        vector<int>v;
        for(int i=0;i<5;i++) v.push_back(i);
        vector<int>::iterator it;
        for(it=v.begin();it!=v.end();it++) cout<<*it<<" ";//输出结果是0 1 2 3 4
        cout<<endl;
        it=v.begin();
        v.insert(it+2,5);//输出结果是0 1 5 2 3 4,因为it指向第一个元素,it+2则指向第三个元素,在第三个元素之前插入5
        for(it=v.begin();it!=v.end();it++) cout<<*it<<" ";
        cout<<endl;
        it=v.begin();
        v.insert(it,3,6);//书上说插入元素之后要重新给it赋值,因为向量空间改变了,,具体按着书上来,每次插入之后都给it重新赋值
        for(it=v.begin();it!=v.end();it++) cout<<*it<<" ";//输出结果为6 6 6 0 1 5 2 3 4,在it指定元素之前插入3个6
        cout<<endl;
        it=v.begin();
        v.erase(it);
        for(it=v.begin();it!=v.end();it++) cout<<*it<<" ";//输出结果为6 6 0 1 5 2 3 4,删除了第一个元素
        cout<<endl;
        //vector<int>::it1;
        it=v.begin();
        v.erase(it,it+3);
        for(it=v.begin();it!=v.end();it++) cout<<*it<<" ";//输出结果为1 5 2 3 4  删除了前三个元素
        cout<<endl;
        v.clear();
        it=v.begin();
        for(it=v.begin();it!=v.end();it++) cout<<*it<<" ";//没有输出结果,因为已经清空了
        return 0;
    }

     5、二维向量

    如果一个向量的每一个元素是一个向量,则称为二维向量:例如
    vector<vector<int> >vv(3,vector<int>(4));  将构造一个二维向量vv,它含有3个元素,每个元素又是含有4个int型元素的向量,编译器两次调用构造函数构造对象vv,第一次调用构造函数构造一个无名的含四个0的vector<int>对象,第二次调用构造函数,以这个无名向量为初值初始化它的三个元素。 一般的vv[r][c]访问第r行第c列的值,表达式vv,size()的值是3,vv[1].size()的值是4,也可以产生长度不一样的向量,具体看代码

    #include<iostream>
    #include<string.h>
    #include<map>
    #include<cstdio>
    #include<cstring>
    #include<stdio.h>
    #include<cmath>
    #include<ctype.h>
    #include<math.h>
    #include<algorithm>
    #include<set>
    #include<queue>
    typedef long long ll;
    using namespace std;
    const ll mod=1e9+7;
    const int maxn=1e5+10;
    const int maxk=3e5+10;
    const int maxx=1e4+10;
    const ll maxe=1000+10;
    #define INF 0x3f3f3f3f3f3f
    #define Lson l,mid,rt<<1
    #define Rson mid+1,r,rt<<1|1
    int main()
    {
        vector<vector<int> >vv;
        for(int i=1;i<=3;i++)
            vv.push_back(vector<int>(i,0));//每一行长度为i,初值为0
        for(int i=0;i<3;i++)
        {
            for(int j=0;j<vv[i].size();j++)
            {
                cout<<vv[i][j]<<" ";
            }
            cout<<endl;
        }
        return 0;
    }

    下面是vector的sort函数的用法

     

    #include<iostream>
    #include<string>
    #include<algorithm>
    #include<cstring>
    #include<vector>
    using namespace std;
    const int maxn=1000+50;
    int main()
    {
        vector<int>a;
        a.push_back(1);
        a.push_back(5);
        a.push_back(3);
        sort(a.begin(),a.end());
        for(int i=0;i<3;i++) cout<<a[i]<<endl;
        return 0;
    }
    当初的梦想实现了吗,事到如今只好放弃吗~
  • 相关阅读:
    人一生最后悔五件事
    C# 实现程序只启动一次(多次运行激活第一个实例,使其获得焦点,并在最前端显示)
    socket 编程 学习2
    Linux内核源码阅读以及工具(转)
    迭代法
    C语言程序设计 C语言中的时间函数(转)
    线段的平移
    数独(sudoku)的生成与破解(转)
    PageBase,ControlBase,Base Class
    Oracle “万年虫”
  • 原文地址:https://www.cnblogs.com/caijiaming/p/9454208.html
Copyright © 2011-2022 走看看