vector容量器的应用

vector容器的应用,感觉最近做的题目还用的挺多

vector与常用数组大部分是相同的,可以进行插入,删除之类的,但是,有些题目,用普通的数组就很容易爆掉,而vector可以动态的根据你所需要的来调整大小。

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

比如   一维数组  vector <int > v;

     二维数组  vector <int *> v;

     三维数组  vector <int **> v;

一些基本用语

erase              删除

insert              插入

begin              指向头指针

end                 指向尾元素+1的尾部位置

empty             判断是否为空

push_back     向容器尾部加入新的数字

pop_back       去掉容器最后一个数字

clear               清空整个容器

size                表示容器所包含的数字

首先最基本的,对于正常的容器进行最基本的插入数据方法

#include<vector>
using namespace std;
int main()
{
    vector<int> v;
    v.push_back(2);
    v.push_back(7);
    v.push_back(9);
    return 0;
}

还有另一种,直接用下标定义的   注意这个v(3) 与普通数组一样,是从0开始计数的,3代表大小。

vector <int > v(3);
v[0]=2;
v[1]=7;
v[2]=9;

接着,接触到了一种新东西,迭代器

具体什么原理也还没太清楚,但是大概知道,不论是vector还是string都可以用这种迭代器来表示长度之类的。

#include<vector>
#include<iostream >
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;
}

接下来是元素的插入方法,用到了insert()

其可以再vector 对象的任意位置前插入一个新的元素,同时,vector 会自动扩张一个元素空间,插入位置后的所有元素依次向后挪动一个位置

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

#include<vector>
#include<iostream>
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;
}

这组数据的输出结果是 8 ,2 ,1 ,7 ,9 ,3;2

元素的删除方法,用到了erase()或者clear()

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

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

代码如下

#include<vector>
#include<iostream>
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 区间的所有元素  (删除1 2 3 4 这4个)
    for(it=v.begin();it!=v.end();it++)
    {
        cout<<*it<<" ";
    }
    cout<<endl;
    v.clear();
    cout<<v.size()<<endl;
    return 0;
}

运行结果是

0 1 3 4 5 6 7 8 9

0 6 7 8 9

0

使用reverser反向排列算法

在头文件algorithm下,代码如下

#include<iostream>
#include<algorithm>
#include<vector>
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;
}

输出结果是

9 8 7 6 5 4 3 2 1 0

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

sort默认为升序排列的,位于algorithm头文件下

#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
int main(int argc,char argv[])
{
    vector<int> v;
    int i;
    for(i=0;i<10;i++)
    {
        v.push_back(9-i);
    }
    for(i=0;i<10;i++)
    {
        cout<<v[i]<<" ";
    }
    cout<<endl;
    sort(v.begin(),v.end());   //////升序排列 
    for(i=0;i<10;i++)
    {
        cout<<v[i]<<" ";
    }
    cout<<endl;
    return 0;
} 

输出结果

9 8 7 6 5 4 3 2 1 0

0 1 2 3 4 5 6 7 8 9

但是,可以自己设计比较函数,然后把函数指定给sort算法,sort就按照自己所规定的规则进行排列。

例如自己设计一个比较函数Comp,对元素从大到小排序

#include<vector>
#include<iostream>
#include<algorithm>
using namespace std;

bool Comp(const int &a,const int &b)
{
    if(a!=b) return a>b;
    else return a>b;
}   /////降序排列 
 
int main(int argc,char *argv[])
{
    vector<int> v;
    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);   按照Comp 函数比较规则排序 
    for(int i=0;i<10;i++)
    {
        cout<<v[i]<<" ";
    }
    cout<<endl;
    return 0;
}

输出结果

0 1 2 3 4 5 6 7 8 9

9 8 7 6 5 4 3 2 1 0

向量容器大小的统计

使用size() 可以返回容器大小,即元素的个数

使用empty() 可以判断容器是否为空   如果为空则返回逻辑真实值 1 ,如果为非空则返回逻辑假 0。

#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
int main()
{
    vector<int> v(10);
    for(int i=0;i<10;i++)
    {
        v[i]=i;
    }
    cout<<v.size()<<endl;   ///输出向量的大小,即包含了多少个元素 
    cout<<v.empty()<<endl;  ///如果为空则输出 1 ,如果非空则输出 0 
    v.clear();
    cout<<v.empty()<<endl;
    return 0;
}

输出结果

10

0

1

以上大概就是vector的通常用法了。

原文地址:https://www.cnblogs.com/wushengyang/p/9350788.html