C++常用STL

一、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版 郑莉、董渊)

  • 17
    点赞
  • 44
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值