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; }