一、STL简介
标准模板库最初是由HP公司的 Alexander Stepanov和Meng Lee开发的一个用于支持C++泛型编程的模板库,1994年被纳入C++标准,成为C++标准库的一部分。由于C++标准库有多种不同的实现,因此STL也有不同的版本,但它们为用户提供的接口都遵守共同的标准。
STL提供了一些常用的数据结构和算法。例如动态数组、集合、映射表,然而,这些并不是STL的全部。STL更重要的意义在于,它定义了一套概念体系,为泛型程序设计提供了逻辑基础。STL中的各个类模板、函数模板的参数都是用这个体系中的概念来规定的。使用STL的一个模板时所提供的类型参数既可以是C++标准库中已有的类型,也可以是自定义的类型——只要这些类型是所要求概念的模型,因此,STL是一个开放的体系。
二、动态数组vector
概念介绍
数组是继承自C语言的一种表示群体数据的方法,具有简单、高效的优点,但无论是静态数组,还是用new 动态创建的数组,都难以检测下标越界的错误,在实际应用中常常造成困扰。事实上,C++标准库也提供了被封装的动态数组——vector,而且这种被封装的数组可以具有各种类型,这就使我们免去了那些重复性工作。vector 不是一个类,而是一个类模板。刚学习动态数组只需在形式上记住vector的使用方式。用vector定义动态数组的形式为:
vector<元素类型>数组对象名(数组长度);
需包含头文件
#include<vector>
尖括号中的类型名表示数组元素的类型。数组长度是一个表达式,表达式中可以包含变量。
vector的基本功能
例如:vector<元素类型> T;
1、T.push_back( ) :在动态数组后面插入一个新的元素。
2、T.pop_back( ) :删除动态数组的最后一个元素。
3、T.size( ) :获取数组的大小。
4、T.clear( ) :清空数组中的元素。
#include<iostream>
using namespace std;
#include<vector>
int main()
{
vector<int>T;
for(int i=1;i<=10;i++)
T.push_back(i); //插入新元素
T.pop_back(); //删除最后一个元素
int size_T=T.size(); //返回数组的大小
T.clear(); //清空数组
cout<<size_T;
}
vector和普通数组一样可以通过下标的方式获得某一位置上元素的值,即数组名[ 下标表达式 ]。与普通数组不同的是,用vector定义的数组对象的所有元素都会被初始化。如果数组的元素类型为基本数据类型,则所有元素都会被以0初始化;如果数组元素为类类型,则会调用类的默认构造函数初始化。因此如果以此形式定义的vector动态数组,需要保证作为数组元素的类具有默认构造函数。另外,初值也可以自己指定,但只能为所有元素指定相同初值,形式为:
vector<元素类型>数组对象名(数组长度,元素初值);
三、集合set
概念介绍
顾名思义,集合(set)所描述的对象与数学上所说的集合很相似。数学上所说的集合是由一些元素所组成的共同体,不包含重复的元素,而STL的集合也是由不重复的元素构成的。但STL集合的元素个数必须是有限的,它不能用来描述数学上的无限集。集合用来存储一组无重复的元素。由于集合的元素本身是有序的,可以高效地查找指定元素,也可以方便地得到指定大小范围的元素在容器中所处的区间。
需包含的头文件:
#include<set>
定义set集合:
set<元素类型>集合名;
set的基本功能
例 set<int>T;
1、T.insert( ) :插入一个新的元素(如果该元素已在集合中存在,则set无变化)。
2、T.erase( ) :删除一个元素。
3、T.count( ) :判断某个元素是否在集合中,若存在,则返回1,反之返回0.
4、set<T>::iterator it 就定义了一个指向该集合的迭代器(我在csdn参考学习迭代器的文章http://t.csdnimg.cn/mQVZt)。
#include<iostream>
using namespace std;
#include<string>
#include<set>
int main()
{
set<string>T;
T.insert("Chinese"); //插入新元素
T.insert("China");
T.insert("chiikawa");
T.insert("Chinese"); //插入已经存在的元素,set不会有变化
T.erase("chiikawa"); //删除一个元素
int Y_N=T.count("chiikawa"); //判断元素是否存在
for(set<string>::iterator it=T.begin();it!=T.end;it++)
cout<<*it;
}
在C++中遍历set是从小到大遍历的,也就是set会帮我们排序。但是如果用set存储我们自定义的结构体,系统必然不知道这个结构体的比较方式,常用方法:运算符重载。
四、映射表map
概念介绍
映射(map)与集合同属于单重关联容器,因此用法上非常相似,它们的主要区别在于,]集合的元素类型是键本身,而映射的元素类型是由锉和附加数据所构成的二元组。这样,在集合中按照键查找一个元素时,一般只是用来确定这个元素是否存在,而在映射中按照键查找一个元素时,除了能确定它的存在性外,还可以得到相应的附加数据。因此,映射的一种通常用法是,根据键来查找附加数据。映射很像是一个“字典”。即关键字集合( key)—>值集合(value)。
需要的头文件:
#include<map>
map的基本功能
例 map<string,int>course;
1、加入新映射对通过插入pair来实现。如果插入的key之前已经存在了,将不会用 新的value来代替原来的,即map无变化。
course.insert(make_pair("C++",1));
2、如果想知道某个关键字是否被映射过:count( )函数。如果是,返回1,否则返回2。
3、C++中遍历map是按关键字的大小遍历的。
4、STL中的map也重载了"[ ]"运算符,可以通过"[ ]"运算符插入、修改或查询已有元素的附加数据。
5、例如,如果需要在映射s中获得键为k的元素的附加数据,可以直接通过表达式s[k];如果要添加键为k的元素或改写键为k的元素的附加数据,则可以为s[k]赋值。严格地说,表达式"s[k]"所执行的操作是,在s中查找键为k的元素,如果存在,则返回它的附加数据的引用,如果不存在,则向s中插入一个新元素并返回该元素附加数据的引用,该附加数据的初值为V(),其中V 是附加数据的类型。比如int的默认值为0,string的默认值为空字符串。
本篇文章是我备赛蓝桥杯学习C++的学习内容总结,只是STL知识部分的冰山一角,当作初学的学习记录(双手合十)。
参考书籍为:C++语言程序设计(第5版 郑莉、董渊)