C++系列(标准模板库STL)

C++标准模板库,简称为STL:Standard Template Lib。关于STL涉及的部分比较多,我们这里只选具有代表性和最常用的部分给大家进行分享。

vector向量

vector的本质就是:对数组的封装。大家可以将其看作是一个数组,只不过对于vector这个数组来说,相对于我们之前所学的传统数组的功能要强大得多。它可以根据所存储的元素个数,自动变长或者缩短,同时,它还具有一个很优秀的特点,即能够在常数时间内完成数据的随机读取。也就是说,无论这个向量数组中有10个元素还是10000个元素,它都能够很快的找出我们想要的数据来。

具体使用方法如下:

向量初始化之后必须要有一些配套的使用方法:

接下来我们来看一看实际使用的例子:

我们去定义一个向量的时候,我们可以写上vector,然后就像我们使用类模板的时候通过类模板去实例化一个模板类,需要传入一个参数int,后面再加上一个变量名vec。当变量vec去调用push_back函数的时候,就会在当前这个向量的最尾部插入一个传入的元素(这里传入的是10),而当调用pop_back函数的时候,就会将这个向量的最尾部的那个元素删掉(这里删掉的就是10,因为上面一行在最尾部插入了10,那么10成了这个向量的最尾部元素了),当我们再去调用size函数的时候,打印出来的就是这个向量元素的个数(这里打印出来的数据元素个数应该是0,因为我们初始化的是一个空向量)。

除此之外,对于一个数组来说,遍历这个数组是非常常见的一种操作。我们来看一看如何来遍历向量,如下:

除了这种遍历方法之外,还有一种常用的遍历方法,那就是用迭代器来进行遍历。我们来看一看什么是迭代器。

迭代器:iterator

通过迭代器(iterator),我们就可以访问标准模板库中的每一个元素了。比如,对于向量来说,我们即可以通过迭代器去遍历向量中的每一个元素,如下:

在这里,我们定义了一个向量vec,并且通过push_back插入了一个字符串”hello”。那么,我们如何来定义一个向量的迭代器呢?其定义方法如下:

vector<数据类型>::iterator 迭代器名,然后通过这个迭代器指向这个向量的第一个元素(vec.begin()),接着就可以用for循环来遍历这个向量的元素了。

链表:list

链表模板的本质是什么呢?我们用一张示意图来说明一下list的数据结构。

 

作为一个链表,它会有一个头结点,也就是第一个结点,而且每一个链表是由若干结点组成(如果一个结点也没有,我们就称之为空链表)。对于每一个结点来说,又由两部分组成(数据域和指针域),上图中的A、B、C、D、E不分就是各自结点的数据域,指针域用来将各个结点串联起来,A结点的指针指向B结点的指针,B结点的指针又指向C结点的指针,以此类推。如果当前的链表是双向链表,也就是说,它不仅可以从头找到尾,还可以从尾找到头,这也是链表的一种。对于链表来说,如果我们想要插入一个数据,比如说,我们在这想要在D和E结点之间插入一个数据,我们就要让D的指针指向要插入进来的数据指针,再让插入进来的指针指向E结点的指针就可以了。相对于向量来说,我们要想在向量的中间部分插入一个数据,那么其后面的每一个数据就要向后移动一个位置,这相对于链表来说,这工作量有点大,相对困难一些。所以,对于链表来说,其特点就是:插入数据的速度快。在使用方法上,链表与向量的使用方法基本相同,也可以通过迭代器进行遍历访问。

映射:map

关于映射,先给大家讲解一下它的数据结构。对于映射来说,存储的数据都是成对出现的,我们把它标记为(key, value),如下所示:

由于映射是成对出现的,所以我们就可以通过它的键(key)来找到对应的值(value)。具体的使用方法,我们通过下面一个例子来说明。

第一行我们定义了一个映射对象m,我们需要向这个对象中放若干对key和value,那么,我们就需要通过pair来定义若干对key和value。在这里我们通过pair来定义了两对p1和p2,对于p1来说,它的key就是10,它的value就是shanghai,对于p2来说,它的key就是20,它的value就是beijing,然后我们通过映射对象m来调用insert函数,分别将p1和p2这两对放到映射m当中去。如果我们想要访问shanghai,那么我们就可以通过打印m[10]来获取,同理,要想访问beijing,就可以通过打印m[20]来获取。我们看到这种访问方式跟数组的访问方式很相似。

#include <iostream>
#include <string>
#include <vector>
#include <list>
#include <map>
#include <stdlib.h>
#include <stdio.h>
using namespace std;
/*
 * vector : 向量,本质是对数组的封装
 * list :链表,双向
 * map :映射(key,value)成对存储
 */

int main()
{

    cout<<"-------------vector相关用法------------"<<endl;
    vector<int>vec;
    vec.push_back(3);
    vec.push_back(4);
    vec.push_back(5);
    vec.push_back(6);
    vec.push_back(8);
    cout<<"------------获取当前向量元素个数-----------"<<endl;
    cout<<vec.size()<<endl;
    cout<<"--------清理尾部数据后,当前向量的个数-------"<<endl;
    vec.pop_back();
    cout<<vec.size()<<endl;
    cout<<"--------方法1:遍历向量元素--------"<<endl;
    for(int i = 0;i < vec.size();i ++){
        cout<<vec[i]<<" ";
    }
    cout<<endl;

    cout<<"--------方法2:遍历向量元素--------"<<endl;
    vector<int>::iterator itor = vec.begin();

    for(;itor != vec.end();itor ++){
        cout<<*itor<<" ";
    }
    cout<<endl;

    cout<<"--------获取当前第一个元素----------"<<endl;
    cout<<vec.front()<<endl;

    cout<<"--------获取当前最后一个元素---------"<<endl;
    cout<<vec.back()<<endl;

    cout<<"-------------list相关用法-----------"<<endl;
    list<int> list1;
    list1.push_back(4);
    list1.push_back(5);
    list1.push_back(6);
    list1.push_back(7);
    list1.push_back(8);
    cout<<"-------------获取当前链表个数---------"<<endl;
    cout<<list1.size()<<endl;

    cout<<"--------------方法2:遍历两边---------"<<endl;
    for(list<int>::iterator itor = list1.begin();itor != list1.end();itor ++){
        cout<<*itor<<" ";
    }
    cout<<endl;


    cout<<"----------map的相关用法----------"<<endl;
    map<int,string> m;
    pair<int,string> p1(20,"hello");
    pair<int,string> p2(30,"world");
    m.insert(p1);
    m.insert(p2);

    cout<<"---------------通过索引遍历map-------------"<<endl;
    cout<<m[20]<<endl;
    cout<<m[30]<<endl;

    cout<<"---------------通过迭代器遍历--------------"<<endl;
    for(map<int,string>::iterator itor1 = m.begin();itor1 != m.end();itor1 ++){
        cout<<itor1->first<<" "<<itor1->second<<endl;

    }

    return 0;
}



猜你喜欢

转载自blog.csdn.net/yuanchunsi/article/details/78989879