C++——之STL部分常用总结——笔记

一、STL =Standard Template Library标准模板库惠普实验室开发的一系列软件的统称。它是由Alexander Stepanov、Meng Lee和David R Musser在惠普实验室工作时所开发出来的。这可能是一个历史上最令人兴奋的工具的最无聊的术语。从根本上说,STL是一些“容器”的集合,这些“容器”有list,vector,set,map等,STL也是算法和其他一些组件的集合。这里的“容器”和算法的集合指的是世界上很多聪明人很多年的杰作。STL的目的是标准化组件,这样就不用重新开发,可以使用现成的组件。STL现在是C++的一部分,因此不用额外安装什麽。它被内建在你的编译器之内。
  在C++标准中,STL被组织为下面的13个头文件:

1iterator就象是容器中指向对象的指针STL的算法使用iterator在容器上进行操作。Iterator设置算法的边界,容器的长度,和其他一些事情。举个例子,有些iterator仅让算法读元素,有一些让算法写元素,有一些则两者都行。 Iterator也决定在容器中处理的方向。
     你可以通过调用容器的成员函数begin()来得到一个指向一个容器起始位置的iterator。你可以调用一个容器的end() 函数来得到过去的最后一个值(就是处理停在那的那个值)

2list Milkshakes这句是你声明了list模板类的一个实例,然后就是实例化这个类的一个对象使用list的成员函数push_backpush_front插入一个元素到list

我们现在有个4个字符串在list中。list的成员函数push_back()把一个对象放到一list的后面,而 push_front()把对象放到前面。我通常把一些错误信息push_back()到一个list中去,然后push_front()一个标题到list中,这样它就会在这个错误消息以前打印它了。

Empty()

知道一个list是否为空很重要。如果list为空empty()这个成员函数返回真我通常会这样使用它。通篇程序我都用push_back()来把错误消息放到list中去。然后,通过调用empty() 我就可以说出这个程序是否报告了错误。如果我定义了一个list来放信息,一个放警告,一个放严重错误,我就可以通过使用empty()轻易的说出到底有那种类型的错误发生了。
    我可以整理这些list,然后在打印它们之前,用标题来整理它们,或者把它们排序成类。
    这是我的意思:

for循环来处理list中的元素

这个程序定义了一个iteratorMilkshakeIterator。我们把它指向了这个list的第一个元素。这可以调用Milkshakes.begin()来作到,它会返回一个指向list开头的iterator。然后我们把它和Milkshakes.end ()返回值来做比较,当我们到了那儿的时候就停下来。
    容器的end()函数会返回一个指向容器的最后一个位置的iterator。当我们到了那里,就停止操作。我们不能不理容器的end()函数的返回值。我们仅知道它意味着已经处理到了这个容器的末尾,应该停止处理了。所有的STL容器都要这样做。

STL的通用算法for_each来处理list中的元素

STL的通用算法count()来统计list中的元素个数

STL的通用算法count_if()来统计list中的元素个数

count_if() 带一个函数对象的参数。函数对象是一个至少带有一个operator()方法的类。有些STL算法作为参数接收函数对象并调用这个函数对象的operator()方法

这个程序是这样工作的:定义一个函数对象类IsAToothbrush,这个类的对象能判断出卖出的是否是牙刷。如果这个记录是卖出牙刷的记录的话,函数调用operator()返回一个true,否则返回false

1双冒号表示域操作符,声明了一个类A,类A里声明了一个成员函数void f(),在类外使用void A::f()表示f()函数是A的成员函数

2直接写在全局函数前,表示是全局函数,在子函数里变量前表示全局变量

3表示引用成员函数及变量作用域成员运算符

例如 system::math::sqrt()相当于system.math.sqrt()

Vector::iteratorv = vec.begin();定义一个向量迭代器v指向vec容器的头

Vector 的函数,

4push_back()成员函数在向量的末尾插入值,如果有必要扩展向量的大小

Size()表示显示向量的大小

Begin()函数返回一个指向向量开头的迭代器,end()指向向量末尾的迭代器

5、queue队列就是一个容器, 先进入的数据先出来,后进入的数据后出来凡是具备这个关键性质的数据结构都叫队列。 你可以用数组也可以用链表队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。

队列queue:include

push(x) x压入队列的末端

front() 返回第一个元素(队顶元素)

back() 返回最后被压入的元素(队尾元素)

empty() 当队列为空时,返回true

size() 返回队列的长度

声明方式:queue q;queue<容器类型> 名称

STL优先队列的使用方法:priority_queue<类型> 名称;

优先队列容器与队列一样,只能从队尾插入元素,从队首删除元素。但是它有一个特性,就是队列中最大的元素总是位于队首,所以出队时,并非按照先进先出的原则进行,而是将当前队列中最大的元素出队。元素的比较规则默认按元素值由大到小排序,可以重载“<”操作符来重新定义比较规则。  

6、容器定义

在数据存储上,有一种对象类型,它可以持有其它对象或指向其它对像的指针,这种对象类型就叫做容器。容器就是保存其他对象的对象

容器种类:

顺序容器:是一种各元素之间有顺序关系的线性表,是一种线性结构的可序群集,vector(向量),list(列表),deque(列队)顺序容器的元素排列次序与元素值无关,而是由元素添加到容器里的次序决定

关联容器:关联式容器是非线性的树结构,更准确的说是二叉树结构。各元素之间没有严格的物理上的顺序关系,也就是说元素在容器中并没有保存元素置入容器时的逻辑顺序。但是关联式容器提供了另一种根据元素特点排序的功能,这样迭代器就能根据元素的特点“顺序地”获取元素元素是有序的集合,默认在插入的时候按升序排列。包括map(集合),set(映射)multimap(多重映射)

容器适配器:本质上,适配器是使一种不同的行为类似于另一事物的行为的一种机制。容器适配器让一种已存在的容器类型采用另一种不同的抽象类型的工作方式实现。适配器是容器的接口,它本身不能直接保存元素,它保存元素的机制是调用另一种顺序容器去实现,即可以把适配器看作“它保存一个容器,这个容器再保存所有元素”。STL 中包含三种适配器:栈stack队列queue 优先级队列priority_queue

 容器类自动申请和释放内存,因此无需newdelete操作

6.1不同容器的使用方法:

1)导入头文件#include

2)定义及初始化

C++——之STL部分常用总结——笔记_第1张图片

 

3)常用的操作方法

C++——之STL部分常用总结——笔记_第2张图片

C++——之STL部分常用总结——笔记_第3张图片

Vector声明二维数组

Vector>vec(m,vector(n,0)),m*n的二维数组,所有元素为0

6.2list(导入头文件#include)

1)定义与初始化

Listlst1

 

C++——之STL部分常用总结——笔记_第4张图片

C++——之STL部分常用总结——笔记_第5张图片

 

C++——之STL部分常用总结——笔记_第6张图片

C++——之STL部分常用总结——笔记_第7张图片

6.3队列deque(导入头文件#include)

Dequevector类似,支持随机访问和快速插入删除,它在容器中的某一位置上的操作所花费的是线性时间。与vector不同的是,deque支持从开始端插入数据:push_front(),其余类似vector方法的使用。

方法小结:

Insert(位置,数量,值)

Erase(位置起点,位置终点)

 

添加元素:

C++——之STL部分常用总结——笔记_第8张图片

 C++——之STL部分常用总结——笔记_第9张图片

 

容器大小的操作

C++——之STL部分常用总结——笔记_第10张图片

C++——之STL部分常用总结——笔记_第11张图片

访问元素:backfront,at,[]

C++——之STL部分常用总结——笔记_第12张图片

删除元素:erasepop_back,pop_front,clear

C++——之STL部分常用总结——笔记_第13张图片

C++——之STL部分常用总结——笔记_第14张图片

赋值与swapassignswap

 

 

C++——之STL部分常用总结——笔记_第15张图片

C++——之STL部分常用总结——笔记_第16张图片

二、操作元素算法:

算法(Algorithm),是用来操作容器中的数据的模板函数。例如,STLsort()来对一个vector中的数据进行排序,用find()来搜索一个list中的对象函数本身与他们操作的数据的结构和类型无关,因此他们可以在从简单数组到高度复杂容器的任何数据结构上使用;

算法部分主要由头文件组成。

是所有STL头文件中最大的一个(尽管它很好理解),它是由一大堆模版函数组成的,可以认为每个函数在很大程度上都是独立的,其中常用到的功能范围涉及到比较、交换、查找、遍历操作、复制、修改、移除、反转、排序、合并等等。
体积很小,只包括几个在序列上面进行简单数学运算的模板函数,包括加法和乘法在序列上的一些操作。
中则定义了一些模板类,用以声明函数对象。

STL中算法大致分为四类:
1)非可变序列算法:指不直接修改其所操作的容器内容的算法。
2)可变序列算法:指可以修改它们所操作的容器内容的算法。
3)排序算法:对序列进行排序和合并的算法、搜索算法以及有序序列上的集合操作。
4)数值算法:对容器内容进行数值计算

以下为举例:

find: 利用底层元素的等于操作符,对指定范围内的元素与输入值进行比较。当匹配时,结束搜索,返回该元素的一个InputIterator 

int *find(int *beginint *endint  value)

   前闭后合的区间 beginend中,查找value如果查找到了就返回第一个符合条件的元素,否则返回end指针

 

sort: 以升序重新排列指定范围内的元素。重载版本使用自定义的比较操作

unique: 清除序列中重复元素,和remove类似,它也不能真正删除元素。重载版本使用自定义比较操作。

remove: 删除指定范围内所有等于指定元素的元素。注意,该函数不是真正删除函数。内置函数不适合使用remove和remove_if函数。

for_each: 用指定函数依次对指定范围内所有元素进行迭代访问,返回所指定的函数类型。该函数不得修改序列中的元素。

max: 返回两个元素中较大一个。重载版本使用自定义比较操作

三迭代器iterator包括:iterator、const_iterator、reverse_iterator和const_reverse_iterator,

概念:用于提供一种方法顺序访问一个聚合对象中各个元素, 而又不需暴露该对象的内部表示。或者这样说可能更容易理解:Iterator模式是运用于聚合对象的一种模式,通过运用该模式,使得我们可以在不知道对象内部表示的情况下,按照一定顺序(由iterator提供的方法)访问聚合对象中的各个元素

库文件#include

三角/反三角函数,双曲函数,指数对数函数exp(),log(),幂函数power()sart()开根号,误差与伽马函数,四舍五入ceil()floor,余数函数fmod(y,x)y/x的余数,round()四射五入,绝对值、最大、最小值fabs(x),abs(),fmax(x,y),fmin(x,y)等

参考:

百度百科:https://wenku.baidu.com/view/3a73a2d9c9d376eeaeaad1f34693daef5ef7133b.html

CSDN:https://www.cnblogs.com/whb-20160329/p/6657828.html

https://blog.csdn.net/frbevrqbn4l/article/details/78536887

https://blog.csdn.net/wsyhawl/article/details/78209562

 

plt:https://blog.csdn.net/u011995719/article/details/71124227

你可能感兴趣的:(C++)