Vector向量容器

vector是C++标准模板库中的部分内容,中文偶尔译作“容器”,但并不准确。
它是一个多功能的,能够操作多种数据结构和算法的模板类和函数库。
vector之所以被认为是一个容器,是因为它能够像容器一样存放各种类型的对象,
简单地说,vector是一个能够存放任意类型的动态数组,能够增加和压缩数据。------摘自Vector百度百科介绍

Vector向量容器优点:

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

2、vector向量容器具有内存自动管理的功能,对于元素的插入和删除,可动态调整所占的内存空间。

3、对于vector容器的容量定义,可以事先定义一个固定大小,之后如果不够用,可以随时调整其大小;也可以事先不定义,随时用push_back()方法从尾部扩张元素,也可以使用insert()在某个元素位置前插入新元素。

4、vector向量容器下标是从0开始计数,跟数组的一样。

Vector向量容器缺点:

时间

运行速度与数组比较更慢。

空间

clear()无法清空内存。------同样摘自Vector百度百科

首先:使用vector向量容器,需要头文件包含声明“#include <vector>”

一、创建vector对象 

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

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

vector<int> v;

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

vector<double> v(10);

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

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

vector<double> v(10,8.6); //定义一个向量容器v,大小为10,每个元素都是8.6;

二、尾部元素扩张和使用下标方式访问vector元素

通常使用push_back()对vector容器在尾部追加新元素。追加新元素,vector容器会自动分配新内存空间。

可以对空的vector对象扩张,也可以对已有元素的vector对象扩张。

下标访问的用法和数组访问方式类似;

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

int main(int argc, char* argv[])
{
    vector<int> v;
    v.push_back(2);        //尾部追加元素
    v.push_back(7);
    v.push_back(9);
    v[3]=2;
    v[4]=7;
    v[5]=9;
    cout<<v[0]<<v[1]<<v[2]<<endl; //下标访问vector元素
    cout<<v[3]<<v[4]<<v[5]<<endl;   
    return 0;
}

运行结果

279

279

也能用at访问

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

int main(int argc, char* argv[])
{
    vector<int> v;
    v.push_back(2);
    int a=v.at(0);
    cout<<a<<endl;
    return 0;
}

运行结果

 (但是这里直接v[0]=2;会错误,只能用v.push_back(2);实现;)

三、用迭代器访问vector元素

迭代器的类型要与它遍历的vector元素类型一致

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

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

int main(int argc, char* argv[])
{
    vector<int> v(3);
    v[0]=2;
    v[1]=7;
    v[2]=9;
    vector<int>::iterator it; //定义迭代器变量,类型为int
    for(it=v.begin();it!=v.end();it++)
    {
        cout<<*it<<" ";  //输出迭代器上的元素值
    }
    cout<<endl;
    return 0;
}

运行结果:

2 7 9 

四、元素的插入

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

这里使用insert()插入的位置,是元素的迭代器位置,不是下标。

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

int main(int argc, char* argv[])
{
    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

五、元素的删除

erase()方法可以删除vector中迭代器所指

的一个元素或一段区间中的所有元素

clear()方法则一次性删除vector中的所有元素(值得注意的是:上面所说缺点clear()无法清空内存,但是可以删除元素)

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

int main(int argc, char* argv[])
{
    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;
}

六、使用reverse反向排列算法

需要头文件: #include <algorithm>

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

int main(int argc, char* argv[])
{
    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;
}

七、使用sort算法对向量元素进行排序

需要头文件: #include <algorithm>

默认情况下,升序排列;另外可以自己设计排序比较函数

#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;
    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;
    sort(v.begin(),v.end(),Comp); //降序
    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

9 8 7 6 5 4 3 2 1 0

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值