代码改变世界

白话C++系列(35) -- C++标准模板库

2016-07-09 22:03  Keiven_LY  阅读(928)  评论(0编辑  收藏  举报

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]来获取。我们看到这种访问方式跟数组的访问方式很相似。

标准模板库代码实践

题目描述:

/*   ************************************************  */

/* 通过使用标准模板库,学习其用法  */

/*   ************************************************  */

程序代码(demo.cpp

#include <iostream>
#include <vector>
#include <list>
#include <map>
#include <string>
using namespace std;

int main()
{
    cout << "---------------------vector的相关用法------------------------" << endl;
    vector<int> vec;  //定义了一个向量vec,其存储的是int类型的数据元素
    vec.push_back(3); //从向量尾部插入一个数据3,由于vec是一个空向量,这里插入的就是其第一个数据
    vec.push_back(4); //再向其尾部插入一个数据4
    vec.push_back(6); //再向其尾部插入一个数据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] << endl;
    }
    cout << "---------方法2:遍历向量元素-----------------" << endl;
    for(vector<int>::iterator itor = vec.begin(); itor != vec.end(); itor++) //迭代器遍历向量元素
    {
        cout << *itor << endl; //迭代器相当于一个指针
    }
    cout << "---------获取当前向量的第一个元素------------" << endl;
    cout << vec.front() << endl; //获取第一个元素
    cout << "---------获取当前向量的最后一个元素---------------------" << endl;
    cout << vec.back() << endl; //获取最后一个元素

    cout << "---------------------list的相关用法-------------------------" << endl;
    list<int> list1;//定义了一个列表list1,其存储的是int类型的数据元素
    list1.push_back(5);
    list1.push_back(9);
    list1.push_back(12);
    //cout << "---------方法1:遍历列表元素-----------------" << endl;
    //for(int j = 0; j < list1.size(); j++)//这里报警告,j是int类型,而list的size返回类型不是size
    //{
    //    cout << list1[j] << endl; //这里报错,list没有[]运算
    //}
    cout << "---------迭代器遍历列表元素-----------------" << endl;
    for(list<int>::iterator itor1 = list1.begin(); itor1 != list1.end(); itor1++)  //迭代器遍历列表元素
    {
        cout << *itor1 << endl; //迭代器相当于一个指针
    }
    cout << "---------------------map的相关用法-------------------------" << endl;
    map<int, string> m;
    pair<int, string> p1(20, "hello");
    pair<int, string> p2(40, "world");
    m.insert(p1);//将p1和p2放到map当中
    m.insert(p2);
    cout << "---------通过索引遍历map-----------------" << endl;
    cout << m[20] << endl;
    cout << m[40] << endl;
    cout << "---------通过迭代器遍历map---------------" << endl;
    for(map<int, string>::iterator itor2 = m.begin(); itor2 != m.end(); itor2++)
    {
        //cout << *itor2 << endl; //这样写肯定会报错,因为map是成对出现的,这样写计算机不知道该如何输出
        //正确输出方法如下:
        cout << itor2->first << " " << itor2->second << endl; //输出键值key和value
    }
    system("pause");
    return 0;
}

运行结果: