(C/C++学习笔记)2.C++中vector的使用

说明:vector是C++中一个非常方便的容器类,它用于存放类型相同元素,利用成员函数相关函数可以方便的对元素进行增加或删,排序或逆序等等,下面将对这些功能一一叙述。

一.vector的第一种用法

1.包含的头文件:#include<vector>

2.格式:vector<Type> vi;   

   创建一个元素类型为Type的vector对象,Type可以是int,double,string,甚至还可以是结构体类型,

3.vi.pushback(Type a);

   在容器的尾部插入一个元素,需要注意的是,插入元素的类型应该与创建 对象时的类型一致。

4.通过下标法像数组一样来访问元素,cout<<vi[i];表示打印vi的第i+1元素到显示屏上,同数组一样,下标访问是从0开始的,这也是此处为什么是第i+1元素的原因。

5.利用迭代器来访问元素,首先得创建一个迭代器格式如下:

   vector <Type>::iterator it;

   然后访问方式如下:  

for(it = vi.begin();it != vi.end();it++)
   cout<<*it<<"    ";
//vi.begin()表示从vi的第一个元素开始,vi.end()表示vi的最后一个元素

6.vi.insert(vi.begin()+count,'a');

   在第count个元素后插入‘a’这个元素,(注意插入元素类型也应该与创建是的元素类型一致)

7.vi.erase(vi.begin()+3,vi.begin()+6);

   删除区间第[3+1,6]个元素,若第二个参数不写,如:vi.erase(vi.begin()+3),则表示删除第(3+1)个元素。

8.以下为两个对容器元素进行翻转排序的函数,使用时需包含的头文件:#include<algorithm>

   (笔者所用的编译环境为QtCreator5.5,在使用时,试了一下,没包含也没报错)

a.reverse(vi.begin(),vi.end());

   将容器中的所有元素进行翻转,即从尾排到头。

b.sort(vi.begin(),vi.end(),Comp);

   按照Comp函数所自定义的排序方式对容器类的元素进行排序,假如定义的Comp函数如下:     

bool Comp(const int &a,const int&b)      //自定义元素排列顺序
{
    return a>b;
}

   则sort函数将按照定义的比较函数进行排序,此处为降序排列,从大到小。值得注意的是,sort函数的第三个参数是可有可无的,当不写时,默认按照升序即从小到大排列,并且当第三个参数存在时,其格式只       能为函数名,不能加函数括号,否则会报错。

9.vi.clear();

   清空元素。

  下面将用一段代码综述以上所讲,仔细看完这段代码,一切将会豁然开朗:

示例1:   

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

bool Comp(const int &a,const int&b)      //自定义元素排列顺序
{
    return a>b;
}

int main()
{
    vector<int> vi;
    //创建vector对象

    cout<<"sizeof(vi) = "<<sizeof(vi)<<endl;
    //模板类对象vi的大小永远是12(本机)

    cout<<endl<<"+++++++++++++++++++++++++++++++++++++"<<endl;
    //分隔符,为了更好地看结果

    for(int i = 0;i<10;i++)
        vi.push_back(i);
    //在容器尾部插入数字

    for(int i = 0;i<10;i++)
        cout<<vi[i]<<"    ";
    //使用下标访问元素,下标是从0开始的

    cout<<endl<<"++++++++++++++++++++++++++++++++++++++"<<endl;
    //同上

    vector<int>::iterator  it;
    //创建一个迭代器用来访问容器vi

    for(it = vi.begin();it != vi.end();it++)
        cout<<*it<<"    ";

    cout<<endl<<"++++++++++++++++++++++++++++++++++++++"<<endl;
    //同上

    vi.insert(vi.begin()+3,'a');
    //在第(3+1)个元素前插入'a';

    for(it = vi.begin();it != vi.end();it++)
        cout<<*it<<"    ";

    cout<<endl<<"+++++++++++++++++++++++++++++++++++++++"<<endl;

    vi.erase(vi.begin()+3);
    //删除第(3+1)个元素

    for(it = vi.begin();it != vi.end();it++)
        cout<<*it<<"    ";
    cout<<endl<<"+++++++++++++++++++++++++++++++++++++++++++++++++"<<endl;

    vi.erase(vi.begin()+3,vi.begin()+6);
    //删除区间第[3+1,6]个元素

    for(it = vi.begin();it != vi.end();it++)
        cout<<*it<<"    ";
    cout<<endl<<"+++++++++++++++++++++++++++++++++++++++++++++++++"<<endl;

    cout<<"vi.size() = "<<vi.size()<<"                     ";
    //求向量的大小(包含的元素个数)

    cout<<"sizeof(vi) = "<<sizeof(vi)<<endl;
    //求类对象vi的大小
    cout<<endl<<"+++++++++++++++++++++++++++++++++++++++++++++++++"<<endl;

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

    for(it = vi.begin();it != vi.end();it++)
        cout<<*it<<"    ";
    cout<<endl<<"+++++++++++++++++++++++++++++++++++++++++++++++++"<<endl;

    sort(vi.begin(),vi.end());
    //将元素排序,默认从小到大

    for(it = vi.begin();it != vi.end();it++)
        cout<<*it<<"    ";
    cout<<endl<<"+++++++++++++++++++++++++++++++++++++++++++++++++"<<endl;

    sort(vi.begin(),vi.end(),Comp);
    //按自定义顺序进行排列元素

    for(it = vi.begin();it != vi.end();it++)
        cout<<*it<<"    ";
    cout<<endl<<"+++++++++++++++++++++++++++++++++++++++++++++++++"<<endl;
    return 0;
}    

 程序运行结果:

 

二.vector的第二种用法(头文件同上)

1.格式:vector<int> vi(10);(相当于int vi[10];)

   其实此种方式与上种在使用方式上几乎一样,唯一的差别在于这种方式在创建一个vector对 象时就已经确定了其大小,并且对于int,double以及指针等类型,默认初始化为0,当然也可以人 为初始化,如:

   vector<int> vi<10,1>;创建了一个vi对象,含有十个int类型的元素,并且每个元素都被初始化为1,       需要注意的是,对于数组,可以这样来初始化:

   int vi[3] = {1,2,3};

   但对于vector对象,则不行。但是可以将 vector 初始化为一个已有数组的全部或一部分,只需指定用来初始化 vector 的数组的开始地址以及(结束地址+1)即可,例如: 

示例2:     

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

int main()
{
    int arr[5] = {0,1,2,3,4};
    vector<int> vi(arr+1,arr+4);
//用数组的第2~4个元素初始化vi
vector<int>::iterator it;
//使用迭代器访问元素
for(it = vi.begin();it != vi.end();it++) cout<<*it<<" "; return 0; }

程序运行结果: 

 

2.vector对象可用另一个vector对象来初始化

   vector<int> vi(10,1);

   vector<int> vj(vi);

3.需要注意的是,用这种方式在创建对象时虽然确定了其大小,但后续的插入,删除等操作会改变‘对象的大小,例如:

示例:

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

int main()
{
    vector<int> vi(10,1);
    vector<int>::iterator  it;
    for(it = vi.begin();it != vi.end();it++)
        cout<<*it<<"    ";
    cout<<endl<<"vi.size = "<<vi.size()<<endl;
    //打印初始大小
    
    cout<<"+++++++++++++++++++++++++++++"<<endl;
    int i = 0;
    for(;i<5;i++)
        vi.push_back(i);
    for(it = vi.begin();it != vi.end();it++)
        cout<<*it<<"    ";
    cout<<endl<<"vi.size = "<<vi.size()<<endl;
    //打印插入5个元素后的大小
    
    cout<<"+++++++++++++++++++++++++++++"<<endl;
    vi.erase(vi.begin()+1);
    for(it = vi.begin();it != vi.end();it++)
        cout<<*it<<"    ";
    cout<<endl<<"vi.size = "<<vi.size()<<endl;
    //打印删除一个元素后的大小
    
    return 0;
}

程序运行结果:

 

猜你喜欢

转载自www.cnblogs.com/tuihou/p/9689719.html