vector向量容器

前言:

        vector向量容器不但能像数组一样对元素进行随机访问,还能在尾部插入元素,是一种简单,高效的容器,完全可以替代数组。

        值得注意的是,vector具有内存自动管理的功能,对于元素的插入和删除,可以动态调整所占的内存空间。

        使用vector向量容器,需要头文件包含声明“#include<vector>”。vector容器的下标是从0开始计数的,像数组一样。对于vector容器的容量定义,可以事先定义一个固定大小,事后可以随时调整其大小;也可以事先不定义,随时使用push_back()方法从尾部扩张元素,也可以使用insert()在某个元素位置前插入新元素。

        vector容器有两个重要的方法,begin()和end()。begin()返回的是首元素位置的迭代器;end()返回的是最后一个元素的下一元素位置的迭代器。

1.创建vector对象:

创建vector对象常用的有三种形式。

(1)不指定容器的元素个数,如定义一个用来存储整型的容器:

        vector <int> v;

(2)创建时,指定容器的大小,如定义一个用来存储10个double类型元素的向量容器:

        vector <double> v(10);

注意元素的下标为0--9;另外,每个元素的值被初始化为0.0;

(3)创建一个具有n个元素的向量容器对象,每个元素具有指定的初始值:

        vector <double> v(10,2.5);

上述语句定义了一个v向量容器,共有10个元素,每个元素的值是2.5。

2.尾部元素扩张:

        通常使用push_back()对vector容器在尾部追加新元素。尾部追加元素,vector容器会自动分配新内存空间。可对空的vector对象扩张,也可对已有元素的vector对象扩张。

        下面的代码将2,7,9三个元素从尾部添加到v容器中,这样,v容器中就有三个元素,其值依次是2,7,9。

#include<vector>
#include<stdio.h>
#include<algorithm>
using namespace std;

int main()
{
    vector<int>v;
    v.push_back(2);
    v.push_back(7);
    v.push_back(9);
    return 0;
}

3.下标方式访问vector元素

        访问或者遍历vector对象是常要做的事情。对于vector对象,可以采用下标方式随机访问它的某个元素,当然,也可以以下标方式对某元素重新赋值,这点类似于数组的访问方式。

         下面的代码就是采用下标的方式对数组赋值,再输出元素的值2,7,9;

#include<vector>
#include<stdio.h>
#include<algorithm>
using namespace std;

int main()
{
    vector<int>v(3);
    v[0]=2;
    v[1]=7;
    v[2]=9;
    printf("%d %d %d\n",v[0],v[1],v[2]);
    return 0;
}

输出:

4.用迭代器访问vector元素

        常使用迭代器配合循环语句来对vector对象进行遍历访问,迭代器的类型一定要和它要遍历的vector对象的元素类型一致。

        下面的代码采用迭代器对vector进行了遍历,输出2,7,9;

#include<vector>
#include<stdio.h>
#include<iostream>
#include<algorithm>
using namespace std;

int main()
{
    vector<int>v(3);
    v[0]=2;
    v[1]=7;
    v[2]=9;
    vector<int>::iterator it;
    for(it=v.begin();it!=v.end();it++)
    {
        cout<<*it<<" ";
    }
    cout <<endl;
    return 0;
}

输出:

5.元素的插入:

        insert()方法可以在vector对象的任意位置前插入一个新的元素,同时,vector自动扩张一个元素空间,插入位置后的所有元素依次向后nuod挪动一个位置。

        要注意的是,insert()方法要求插入的位置,是元素的迭代器的位置,而不是元素的下标。

        下面的代码输出的结果是8,2,1,7,9,3;

#include<vector>
#include<stdio.h>
#include<iostream>
#include<algorithm>
using namespace std;

int main()
{
    vector<int>v(3);
    v[0]=2;
    v[1]=7;
    v[2]=9;
    v.insert(v.begin(),8);//在最前面插入新元素8;
    v.insert(v.begin()+2,1);//在第2个元素前面插入新元素1;
    v.insert(v.end(),3);//在向量末尾追加新元素3;
    vector<int>::iterator it;//定义迭代器;
    for(it=v.begin();it!=v.end();it++)
    {
        cout<<*it<<" ";
    }
    cout <<endl;
    return 0;
}

输出:

 6.元素的删除:

        erase( )方法可以删除vector中迭代器所指的一个元素或者一段区间中的所有元素。

        clear( )方法则依次性删除vector中的所有元素。

#include<vector>
#include<stdio.h>
#include<iostream>
#include<algorithm>
using namespace std;

int main()
{
    vector<int>v(10);
    for(int i=0;i<10;i++)
    {
        v[i]=i;
    }
    v.erase(v.begin()+2);//删除前2个元素,从0开始;
    vector<int>::iterator it;//定义迭代器;
    for(it=v.begin();it!=v.end();it++)
    {
        cout<<*it<<" ";
    }
    cout <<endl;
    v.erase(v.begin()+1,v.begin()+5);//删除迭代器第1到第5区间的所有元素;
    for(it=v.begin();it!=v.end();it++)
    {
        cout<<*it<<" ";
    }
    cout <<endl;
    v.clear();//清空向量;
    cout<<v.size()<<endl;//输出向量的大小;
    return 0;
}

输出:

7.使用reverse反向排列算法:

        reverse反向排列算法,需要定义头文件“#include<algorithm>” .

        reverse算法可将向量中的某段迭代器区间元素反向排列,看下面这段代码:

#include<vector>
#include<stdio.h>
#include<iostream>
#include<algorithm>
using namespace std;

int main()
{
    vector<int>v(10);
    for(int i=0;i<10;i++)
    {
        v[i]=i;
    }
    reverse(v.begin(),v.end());//反向排列向量中的元素;
    vector<int>::iterator it;//定义迭代器;
    for(it=v.begin();it!=v.end();it++)
    {
        cout<<*it<<" ";
    }
    cout <<endl;
    return 0;
}

输出:

8.使用sort算法对向量元素排序:

       使用sort算法,需要声明头文件“#include<algorithm>”。

        sort算法要求使用随机访问迭代器进行排序,在默认的情况下,对向量元素进行升序排列,下面这份程序很好的说明了sort算法的使用方法:

#include<vector>
#include<stdio.h>
#include<iostream>
#include<algorithm>
using namespace std;

int main()
{
    vector<int>v(10);
    v.clear();//先把向量清空;
    for(int i=0;i<10;i++)
    {
        v.push_back(9-i);
    }
    for(int i=0;i<10;i++)
    {
        cout<<v[i]<<" ";
    }
    cout<<endl;
    sort(v.begin(),v.end());//sort排序;
    vector<int>::iterator it;//定义迭代器;
    for(it=v.begin();it!=v.end();it++)
    {
        cout<<*it<<" ";
    }
    cout <<endl;
    return 0;
}

输出:

9.自定义比较函数:

        还可以自己设计排序比较函数,然后,把这个函数指定给sort算法,那么,sort就根据这个比较函数指定的排序规则进行排序。下面的程序自己设计了一个排序比较函数Comp,要求对元素的值由大到小进行排序。

#include<vector>
#include<stdio.h>
#include<iostream>
#include<algorithm>
using namespace std;

bool Comp(const int &a,const int &b)
{
        return a>b;
}

int main()
{
    vector<int>v(10);
    v.clear();//先把向量清空;
    for(int i=0;i<10;i++)
    {
        v.push_back(i);
    }
    for(int i=0;i<10;i++)
    {
        cout<<v[i]<<" ";
    }
    cout<<endl;
    sort(v.begin(),v.end(),Comp);//sort排序;
    vector<int>::iterator it;//定义迭代器;
    for(it=v.begin();it!=v.end();it++)
    {
        cout<<*it<<" ";
    }
    cout <<endl;
    return 0;
}

输出:

10.向量的大小:

        使用size()方法可以返回向量的大小,即元素的个数。

        使用empty()方法返回向量是否为空。

#include<vector>
#include<stdio.h>
#include<iostream>
#include<algorithm>
using namespace std;

bool Comp(const int &a,const int &b)
{
        return a>b;
}

int main()
{
    vector<int>v(10);
    v.clear();//先把向量清空;
    for(int i=0;i<10;i++)
    {
        v.push_back(i);
    }
    cout<<v.size()<<endl;//输出向量的大小,即元素的个数;
    cout<<v.empty()<<endl;//输出向量是否为空,为空返回1,非空返回0;
    v.clear();//清空向量;
    cout<<v.empty()<<endl;//输出向量是否为空,为空返回1,非空返回0;
    return 0;
}

输出:

11.其他

添加点自己做题时碰到的函数。

resize(),设置大小(size);
reserve(),设置容量(capacity);

size()是分配容器的内存大小,而capacity()只是设置容器容量大小,但并没有真正分配内存
打个比方:正在建造的一辆公交车,车里面可以设置40个座椅(reserve(40);),这是它的容量,但并不是说它里面就有了40个座椅,只能说明这部车内部空间大小可以放得下40张座椅而已。而车里面安装了40个座椅(resize(40);),这个时候车里面才真正有了40个座椅,这些座椅就可以使用了。

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值