现在的位置: 首页 > 综合 > 正文

【STL】STL基础

2018年04月23日 ⁄ 综合 ⁄ 共 3415字 ⁄ 字号 评论关闭

一、STL组成

1、六大组件

容器(Container)、算法(Algorithm)、迭代器(Iterator)

仿函数(Function Object)、适配器(Adapter)、空间配置器(allocator)

2、STL的命名空间为std

3、 algorithm   <alglrithm>

四个数值相关演算法 <numeric>

vector <vector>

list <list>

deque <deque>

stack <stack>

queue <queue>

priority queue <queue>

map  <map>

set <set>

multimap <map>

multiset <set>

function objects <functional>

iterator adaptor <iterator>

 

二、容器的概念

1、用来管理一组元素

2、容器分为

1)序列式容器:每个元素都有固定位置--取决于插入时机和地点,和元素值无关

如:vector、deque、list

2)关联式容器:元素位置取决于特定的排序规则,和插入顺序无关

如:set、multiset、map、multimap

3、序列式容器

1)vector

将元素置于一个动态数组中加以管理

可以随机存取元素(用索引直接存取),支持operator[] 

数组尾部添加或移除元素非常快速,但是在中部或头部安插元素比较费时

2)deque:double-ended queue

可以随机存取元素(用索引直接存取),支持operator[] 

数组头部和尾部添加或移除元素都非常快速,但是在中部安插元素比较费时

3)list

双向链表

不提供随机存取(按顺序走到需存取的元素,O(n)),不支持operator[] 

在任意位置上执行插入或删除动作都非常迅速,内部只需调整一下指针。

4、关联式容器

1)set/multiset

内部的元素依据其值自动排序,不能用push_back等函数

set内的相同数值的元素只能出现一次,multiset内可包含多个数值相同的元素

内部由二叉树实现,便于查找

2)map/multimap

map的元素师成对的键值、实值,内部的元素依据其值自动排序

map内的相同数值的元素只能出现一次,multimap内可包含多个数值相同的元素

内部由二叉树实现,便于查找

5、容器的共同能力

所有容器提供的都是value语意,而非reference语意。容器执行插入元素的操作时,内部实施copy操作。所以STL容器内存储的元素

必须能够被拷贝(必须提供拷贝构造函数)

每个容器都提供可返回迭代器的函数,运用返回的迭代器就可以访问元素。

6、容器的使用动机

vector deque list set multiset map multimap

典型内部结构 动态数组 二维数组 双向链表 二叉树 二叉树 二叉树 二叉树

可随机存取 对key而言是

元素搜索速度 非常慢 对key而言快 对key而言快

快速安插移除 尾部 头尾 任何位置 - - - -

安插移除导致 重新配置 总是如此 绝不会 绝不会 绝不会 绝不会 绝不会

失效(迭代

器、指针、引

用)

7、剩余容器

queue、stack, 都只不过是一种adapter,简单地修饰deque的界面而成为新的容器类型

 

 

 

三、迭代器

1、简述

通过迭代器,我们可以用相同的方式来访问、遍历容器

每种容器都必须提供自己的迭代器

迭代器是一个“可遍历STL容器内全部或部分元素”的对象

一个迭代器指出容器中的一个特点位置

具有遍历复杂数据结构的能力

2、迭代器的基本操作

Operator *     传回当前位置上的元素值

Operator ++ 将迭代器前进至下一元素

Operator == and Operator != 判断两个迭代器是否指向同一位置

Operator =  为迭代器赋值

3、作用

能够让迭代器与算法不干扰的相互发展,最后又能无间隙的粘合起来

容器提供迭代器,算法使用迭代器

4、分类

不同容器提供自己的迭代器,所以不同迭代器具有不同的能力

不同的算法需要不同的迭代器的能力,相同的算法需要根据迭代器的能力不同而作相应的优化

input iterator output iterator

forward iterator

bidirectional iterator

random access iterator

5、迭代器的相关类型

有些算法内部需要用到迭代器所代表元素的类型,这个就是迭代器的相关类型

 

 

四、算法

1、泛型算法通则

所有算法的前两个参数都是一对iterators:[first, last],用来指出容器内一个范围内的元素

每个算法的声明中,都表现出它所需要的最低层次的iterator类型

大部分算法都可以用function object来更改准则。function object又称functor

2、算法列表(共70个)

accumulate() 元素累加

adjacent_difference() 相邻元素的差额

adjacent_find() 搜寻相邻的重复元素

binary_search() 二元搜寻

copy() 复制

copy_backward() 逆向复制

count() 计数

count_if() 在特定条件下计数

equal() 是否相等

equal_range() 是否相等,传回一个上下限区间范围

fill() 改填元素值

fill_n() 改填元素值n次

find() 搜寻

find_if() 在特定条件下搜寻

find_end() 搜寻某个字序列的最后一次出现地点

find_first_of() 搜寻某些元素的首次出现地点

for_each() 对范围内的每一个元素进行某操作

generate() 以指定动作的运算结果填充特定范围内的元素

generate_n() 以指定动作的运算结果填充n个元素内容

includes() 包含

inner_product() 内积

inplace_merge() 合并并取代

iter_swap() 交换元素

lexicographical_compare() 以字典排列方式做比较

lower_bound() 下限

max() 最大值

max_element() 最大值所在位置

min() 最小值

min_element() 最小值所在位置

merge() 合并两个序列

mismatch() 找出不吻合点

next_permutation() 获取下一个排列组合

nth_element() 重新安排序列中第n个元素的左右两端

partial_sort() 局部排序

partial_sort_copy() 局部排序并复制到它处

partial_sum() 局部综合

partition() 切割

prev_permutation() 获取前一个排列组合

random_shuffle() 随机重排

remove() 移除某种元素(但不删除)

remove_copy() 移除某种元素并将结果复制到另一个container

remove_if() 有条件的复制某种元素

remove_copy_if() 有条件的移除某种元素并将结果复制到另一个container

replace() 取代某种元素

replace_copy() 取代某种元素,并将结果复制到另一个container

replace_if() 有条件的取代

replace_copy_if() 有条件的取代,并将结果复制到另一个container

reverse() 颠倒元素次序

reverse_copy() 颠倒元素次序并将结果复制到另一个container

rotate() 旋转

rotate_copy() 旋转,并将结果复制到另一个container

search() 搜寻某个子序列

search_n() 搜寻[连续发生n次]的子序列

set_difference() 差集

set_intersection() 交集

set_symmetric_difference() 对称交集

set_union() 联集

sort() 排序

stable_partition() 切割并保持元素相对次序

stable_sort() 排序并保持等值元素相对次序

swap() 交换

swap_range() 交换,指定范围

transform() 以两个序列为基础,交互作用产生第三个序列

unique() 将重复的元素折叠缩编,使成唯一

unique_copy() 将重复的元素折叠缩编,使成唯一,并复制到它处

upper_bound() 上限

make_heap() 制造一个heap

pop_heap() 从heap中取出一个元素

push_heap() 将一个元素推进heap内

sort_heap() 对heap排序

 

 

 

 

抱歉!评论已关闭.