STL基础

一.STL概述
1.STL定义

STL(Standard Template Library)标准模板库,该库包含了许多基本数据结构和基本算法,为广大C++程序猿提供了一个可扩展的一应用框架,STL是最新的C++标准函数库中的一个子集

2.常见组件容器 迭代器 容器

容器:可容纳各种数据类型的数据结构
迭代器:可依次存取容器中元素的东西
算法:用来操作容器中的元素的函数模板。例如,STL用sort()来对一个vector中的数据进行排序
例子:数组int array[100]就是一个容器,而int*类型的指针就可以作为迭代器,可以为这个容器编写一个排序算法

二.容器
1.vector

1)用动态数组来实现
2)必须包含头文件#include
3)vector支持随机存取
4)vectorde 大小(size)和容量(capacity)
size :返回实际元素的个数
capacity:返回能容纳元素最大的数量。如果插入元素时,元素个数超过capacity,需要重新配置内部存储器

2.deque

1)deque是“double-ended queue”的缩写。在两端增删元素具有较佳的性能。
2)模拟动态数组,与vector相似,所有适用于vector的操作都适用于deque
3)deque还有push_front(将元素插到前面)和pop_front(删除最前面的元素)操作

3.List

1)list是双向链表。
2)不支持随机存取,不支持at.[pos]函数和[]操作符
3)list除了具有所有顺序容器都有的成员函数以外,还支持下面成员函数

函数解释
push_front在前面插入
pop_front删除前面的元素
sort排序(list单独实现)
remove删除和指定值相同的元素
merge合并两个链表,并清空被合并的那个(list单独实现)
reverse颠倒链表
4.set/multiset

1)底层使用平衡的搜索树—红黑树
2)内部元素有序排列,新元素插入的位置取决于它的值,查找速度快
3)支持通过键值是实现快速读取
4)不支持at.[pos]函数和[]操作符
5)不可以直接修改set或multiset容器中的元素值,因为该类容器是自动排序。如果希望修改一个元素值,必须先删除原有的元素,再插入新的元素
6)multiset支持同一个键多次出现的set类型

5.map/multimap

1)底层使用平衡的搜索树—红黑树实现
2)元素包含两部分(key,value),key和value可以是任意类型
3)根据元素的key自动对元素排序,因此根据元素的key进行定位很快,但根据元素的value定位很慢
4)不能直接改变元素的key,可以通过[]操作符直接存取元素的值
5)map中不允许key相同的元素,multimap允许key相同的元素
map/multimap结构图

6.stack

1)是后进后出的数据结构,只能插入、删除、访问栈顶的元素
2)可以做如下操作
a)push(e) 将元素压栈
b)top() 返回栈顶元素的引用,但不移除
c)pop() 从栈中移除栈顶元素,但不返回
3)结构结构

7.queue/priority_queue
queue

1.先进先出的数据结构
2.可以做如下操作
a)push(e) 将元素置入队尾
b)front() 返回队列头部的引用,但不移除
c)back() 返回队列尾部的引用,但不移除
d)pop() 从队列头部移除元素但不迟到
3.示意图
在这里插入图片描述

priority_queue

1.以某种排序规则(默认是less)管理队列中的元素
2.可以做如下操作
a)push(e) 根据元素的优先级将元素置入队列
b)top() 返回队列头部(最大元素)的引用,但不移除
c)pop() 删除队列头部(最大)的元素,但不返回
d)empty() 判断队列是否为空

三.算法
1.基本概念

STL提供了能在各种容器中通用的算法,比如插入,删除,查找,排序等
算法部分主要由头文件 < algorithm > < numeric > < functional > 组成
< algorithm >所有STL头文件中最大的一个,其中常用的功能涉及到比较交换查找遍历操作、复制、修改、反转、排序、合并等等
< numeric >体积较小,简单的数学模板函数
< functional >定义一些模板类

2.常见算法
算法说明举例
非可变序列算法指不直接修改其所操作的容器内容的算法,如查找、统计、搜索函数find() find_if() count()统计等于某值的容器元素个数 count_if() search() search_if()
可变序列算法指可以修改它们所操作的容器内容的算法,如拷贝、替换、删除函数copy() transformk()replace()replace_if() remove() remove_if()
排序算法指可以对指定容器进行排序的算法sort()普通排序 make_heap()将一个区间转换成堆 sort_heap()对堆进行排序,排序后就不是堆了
四.迭代器
1.基本概念
  • 用于指向容器内的一个元素,有const和非const两种
  • 通过迭代器可以读取它指向的元素,通过非const迭代器还能修改其指向的元素。迭代器的用法和指针类似。
  • 迭代器是容器和算法的桥梁,STL容器和算法是分离的,连接它们的是迭代器
2.使用方法
  • 定义一个容器类为迭代器的方法
    容器类名::iterator 变量名 ,如 vector;;iterator vit;
    容器类名::const_itertor 变量名,如vector::const_iterator vit
  • 访问一个迭代器指向的元素
    “* 迭代器变量名"
  • 不同容器上支持的迭代功能强弱有所不同,容器的迭代器的功能强弱决定了该容器是否支持STL中的某种算法
  • 迭代器按功能由弱到强
编号功能说明
1输入Input iterators 提供对数据的只读访问
2输出Output iterators 提供对数据的只写访问
3正向Forward iterators 提供读写操作,并能向前推进迭代器
4双向Bidirectional iterators 提供读写操作,并能向前和向后操作
5随机Random access iterators 提供读写操作,并能在数据中随机移动

编号大的迭代器拥有编号小的迭代器的功能,能当编号小的迭代器使用

3.操作

所有迭代器: ++p,p++
输入迭代器 *p ,p=p1,p==p1,p!=p1
输出迭代器 *p ,p=p1
正向迭代器 上面全部
双向迭代器 上面全部–p,p–
随机访问迭代器:上面全部,以及下面
p+=i,p-=i
p+i
p-i
p[i]
p<p1,p<=p1,p>p1,p>=p1

4.类别
容器迭代器类别
vector随机
deque随机
list双向
set/multiset双向
map/multimap双向
stack不支持迭代器
queue不支持迭代器
priority_queue不支持迭代器
五.STL使用自定义对象
  • 向vector,deque,list,stack,queue添加自定义对象,实际是将对象复制一份放到容器里,要调用对象的拷贝函数,定义了拷贝函数的调用定义的拷贝函数,没定义的调用默认的拷贝函数
  • set和map容器添加自定义对象也是将对象复制一份放到容器了,不同的是,set和map容器实现比较器函数
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值