欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

C++中的Vector(向量)的介绍

程序员文章站 2022-03-31 09:30:03
一、Vector(向量) vector(向量)是一种对象实体,能够容纳许多其他类型相同的元素, 因此又被称为容器。 与string相同,vector同属于STL(Standar...

一、Vector(向量)

vector(向量)是一种对象实体,能够容纳许多其他类型相同的元素, 因此又被称为容器。

与string相同,vector同属于STL(Standard Template Library, 标准模板库)中的一种自定义的数据类型,可以广义上认为是数组的增强版。

在使用它时, 需要包含头文件 vector

#include <vector>

vector 容器与数组相比其优点在于它能够根据需要随时自动调整自身的大小以便容下所要放入的元素。此外,vector也提供了许多的方法来对自身进行操作。

二、Vector的声明及初始化

vector<int> a;          //声明一个int型向量a

vector<int> a(10);      //声明一个初始大小为10的向量

vector<int> a(10, 1);   //声明一个初始大小为10且初始值都为1的向量

vector<int> b(a);       //声明并用向量a初始化向量b

vector<int> b(a.begin(), a.begin()+3);      //将a向量中从第0个到第2个(共3个)作为向量b的初始值

除此之外, 还可以直接使用数组来初始化向量:

int n[] = {1, 2, 3, 4, 5};

vector<int> a(n, n+5);          //将数组n的前5个元素作为向量a的初值

vector<int> a(&n[1], &n[4]);    //将n[1]-n[4]范围内的元素作为向量a的初值

三、元素的输入及访问

-> 使用下表访问元素

元素的输入和访问可以像操作普通的数组那样
输入:

cin>>a[n];

输出:

cout<<a[n];

示例:

#include <iostream>
#include <vector>
using namespace std;
int main()
{
    vector<int> a(10, 0);//大小为10初值为0的向量a

    //对其中部分元素进行输入
    cin >> a[2];
    cin >> a[5];
    cin >> a[6];

    //全部输出
    int i ;
    for(i=0; i<a.size(); i++)
        cout << a[i] << " ";

    return 0 ;
}

-> 使用迭代器访问元素

在上例中,将元素全部输出部分的代码可以改写为:

//全部输出
vector<int>::interator t;
for(t = a.begin(); t != a.end(); t++)
    cout<< *t << " ";

*t为指针的间接访问形式,意思是访问t所指向的元素值。

四、Vector的基本操作

1>  a.size()        //获取向量中的元素个数

2>  a.empty()       //判断向量是否为空

3>  a.clear()       //清空向量中的元素

4>  a = b ;         //将b向量复制到a向量中

5>  比较 - 保持 ==、!=、>、>=、<、<= 的惯有含义。

6>  插入 - insert

    ① a.insert(a.begin(), 1000);
    //将1000插入到向量a的起始位置前

    ② a.insert(a.begin(), 3, 1000);     //将1000分别插入到向量元素位置的0-2处(共3个元素)

    ③ vector<int> a(5, 1);
       vector<int> b(10);
       b.insert(b.begin(), a.begin(), a.end());      //将a.begin(),a.end()之间的全部元素插入到b.begin()前

7>  删除 - erase

    ① b.erase(vec.begin()+2);                 //删除第3个元素

    ② vec.erase(vec.begin()+i,vec.end()+j);   //删除区间[i,j-1]

8>  交换 - swap

    b.swap(a) ;            //a向量与b向量进行交换

五、二维Vector

与数组相同,向量也可以增加维数,例如声明一个m*n大小的二维向量方式可以像如下形式:

vector< vector<int> > b(10, vector<int>(5));        //创建一个10*5的int型二维向量

在这里,实际上创建的是一个向量中元素为向量的向量。同样可以根据一维向量的相关特性对二维向量进行操作。
例:

#include <iostream>
#include <vector>
using namespace std ;
int main()
{
    vector< vector<int> > b(10, vector<int>(5, 0)) ;

    //对部分数据进行输入
    cin>>b[1][1];
    cin>>b[2][2];
    cin>>b[3][3];

    //全部输出
    int m, n;
    for(m=0; m<b.size(); m++)         //b.size()获取行向量的大小
    {
        for(n=0; n<b[m].size(); n++)  //获取向量中具体每个向量的大小
            cout<<b[m][n]<<" " ;
        cout<<"\n" ;
    }

    return 0;
}

六、结构体Vector

Vector的元素不仅仅可以是int,double,string,还可以是结构体,但是要注意:结构体要定义为全局的,否则会出错。 下面是一段简短的程序代码:

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

typedef struct rect
{
    int id;
    int length;
    int width;

  //对于向量元素是结构体的,可在结构体内部定义比较函数,下面按照id,length,width升序排序。
  bool operator< (const rect &a)  const
    {
        if(id!=a.id)
            return id<a.id;
        else
        {
            if(length!=a.length)
                return length<a.length;
            else
                return width<a.width;
        }
    }
}Rect;

int main()
{
    vector<Rect> vec;
    Rect rect;
    rect.id=1;
    rect.length=2;
    rect.width=3;
    vec.push_back(rect);
    vector<Rect>::iterator it=vec.begin();
    cout << (*it).id << ' ' << (*it).length << ' ' << (*it).width << endl;    

    return 0;
}

七、算法

1、 使用reverse将元素翻转:
需要头文件#include

reverse(vec.begin(),vec.end());         //将元素翻转

2、使用sort排序:
需要头文件#include

sort(vec.begin(),vec.end());            //默认是按升序排列,即从小到大

可以通过重写排序比较函数按照降序排序,如下:

定义排序比较函数:

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

调用时:

sort(vec.begin(),vec.end(),Comp)        //降序排序。