程序设计与算法三八周笔记STL

泛型程序设计简单地说是使用模板的程序设计法。

将一些常用的数据结构(比如链表,数组,二叉树)和算法(比如排序,查找)写成模板,以后则不论数据结构里放的是什么对象,算法针对什么样的对象,则都不必重新实现数据结构,重新编写算法。

标准模板库(标准模板库)就是一些常用数据结构和算法的模板的集合。

有了STL,不必再写大多的标准数据结构和算法,并且可获得非常高的性能。 

STL中的基本的概念

容器:可容纳各种数据类型的通用数据结构,是类模板

迭代器:可用于依次存取容器中元素,类似于指针

算法:用来操作容器中的元素的函数模板

  • 排序()来对一个矢量中的数据进行排序
  • 找到()来搜索一个列表中的对象

算法本身与他们操作的数据的类型无关,因此他们可以在从简单数组到高度复杂容器的任何数据结构上使用。

容器以用于存放各种类型的数据(基本类型的变量,对象等)的数据结构,都是类模版,分为三种:

1)顺序容器

           矢量,双端,列表

2)关联容器

           设置,多集,地图,多重映射

3)容器适配器

           栈,队列,priority_queue 

 

对象被插入容器中时,被插入的的英文对象的一个复制品。许多算法,比如排序,查找,要求对容器中的元素进行比较,有的容器本身就是排序的,所以,放入容器的对象所属的类,往往还应该重载==<运算符。

 

顺序容器简介:

容器并非排序的,元素的插入位置同元素的值无关。

有载体,双端队列,列表三种

矢量头文件<矢量>动态数组。

元素在内存连续存放。随机存取元素任何都能在常数时间完成。在尾端增量元素具有较佳的性能(大部分情况下是常数时间)。因为矢量一般会多分配存储空间,元素填满空间溢出后,才会重新再分配存储空间。

队列queue详细介绍:

https://www.cnblogs.com/xuning/p/3321733.html

双端队列头文件<双端队列>双向队列。

元素在内存连续存放。随机存取任何元素都能在常数时间完成(但次于vector)在两端增量元素具有较佳的性能(大部分情况下是常数时间)。 

 

列表头文件<列表>双向链表。

元素在内存不连续存放,在任何位置增量元素都能在常数时间完成不支持随机存取。

 

关联容器:

  1. 元素是排序的
  2. 插入任何元素,都按相应的排序规则来确定其位置
  3. 在查找时具有非常好的性能
  4. 通常以平衡二叉树方式实现,插入和检索的时间都是O(日志(N))
  • set / multiset头文件<set>

                       设置即集合.SET中不允许相同元素,多集中网求允许存在相同的元素

  • map / multimap头文件<map>   

                       地图与集的不同在于映射存放中的元素有御姐仅有两个成员变量,一个名为第一,另一个名为第二,地图根据第一值对元素进行从小到大排序,并可快速地根据第一来检索元素.MAP多同图产品的不同在于是否网求允许相同第一值的元素

 

容器适配器

堆栈:头文件<堆>栈。

是项的有限序列,并满足序列中被删除,检索和修改的项只能是最近插入序列的项(栈顶的项)。后进先出。 

队列头文件<队列>队列。

插入只可以在尾部进行,删除,检索和修改只允许从头部进行。先进先出。

priority_queue头文件<队列>优先级队列。

最高优先级元素总是第一个出列

 

顺序容器和关联容器中都有的成员函数:

 

顺序容器的常用成员函数:

 

迭代器:

定义一个容器类的迭代器的方法可以是:

容器类名:: iterator变量名;

或:

容器类名:: const_iterator变量名;

访问一个迭代器指向的元素:

*迭代器变量名 

迭代器上可以执行++操作,以使其指向容器中的下一个元素。如果迭代器到达了容器中的最后一个元素的后面,此时再使用它,就会出错,类似于使用NULL或未初始化的指针一样。

 

双向迭代器:

随机访问迭代器:

P <P1指的是p在P1前面:

 

算法简介:

在STL里的区间都是左闭右开的

 

向量:

vector::erase():从指定容器删除指定位置的元素或某段范围内的元素

vector::erase()方法有两种重载形式

如下:

1,迭代器擦除(iterator _Where);

v1.erase(v1.begin()); //删除v1中的第一个元素

vec.erase(vec.begin()+ 2);删除第3个元素

2,迭代器擦除(迭代器_First,iterator _Last);

    //删除v1.begin()+ 1和v1.begin()+ 2两个元素

v1.erase(v1.begin()+ 1,v1.begin()+ 3);

vec.erase(vec.begin()+ 1,vec.begin()+ j)的;删除区间[I,J-1];区间从0开始

 

 

 

 

双端队列

所有适用于向量的操作都适用于deque.deque还有push_front(将元素插入到前面)和pop_front(删除最前面的元素)操作,复杂度是O(1)

拼接:在指定位置前面插入另一链表中的一个或多个元素,并在另一链表中删除被插入的元素

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值