• STL概述

STL (Standard Template Library, 标准模板库) 是惠普实验室开发的一系列软件的统称。主要核心分为三大部分:容器(container)、算法(algorithm)和迭代器(iterator),另外还有容器适配器(container adaptor)和函数对象(functor)等其它标准组件。

  • 容器:

顺序容器:

名称

特性

vector

模拟的数据结构式动态数组,在内存中是连续储存的,支持随机存取,支持在尾部快速插入和删除元素,搜索速度较慢

deque

称为双端队列,在内存中的储存方式是小片连续,每片之间用链表连接起来,支持随机存取,支持在头部和尾部快速插入和删除元素,搜索速度较慢

list

称为双向链表,在内存中的储存是不连续的,每个元素的内存之间用指针相连,不支持随机存取(因为要从首或尾遍历至指定位置),但是支持在任意位置快速插入和删除元素,搜索速度最慢,扩展内存时无需复制和拷贝原元素

array

称为静态数组,在内存中是连续储存的,支持随机存取,不支持插入或删除元素

forward_list

称为前向链表,在内存中的储存是不连续的,同list一样支持在任意位置快速插入和删除元素,不支持随机存取,搜索速度也较慢,与list最大的区别在于其只能从头部遍历至尾部,不能反向遍历,因此没有保存后向指针,比list更省内存,插入和删除元素比list稍慢。

注:红色加粗的容器为C++11标准中新增的

关联式容器:

名称

特性

set

以红黑树实现,内存中是不连续储存的,保存的是元素是唯一的键值且不可变,排列的方式根据指定的严格弱序排列,不支持随机存取,搜索速度较快

multiset

与set基本一致,差别就在于允许保存重复键值

map

同样以红黑树实现,保存的元素是一个pair类型{key, value},每个键值对应一个值,且键值唯一不可变,键值的排列方式根据指定的严格弱序排列,支持用key进行随机存取,搜索速度较快

multimap

与map基本一致,差别在于键值可以重复

名称

特性

unordered_set

以哈希表实现,内存中是不连续储存的,保存的是元素是唯一的键值且不可变,无序的排列方式,不支持随机存取,搜索速度比红黑树实现的set要快

unordered_multiset

与unordered_set基本一致,差别就在于允许保存重复键值

unordered_map

同样以哈希表实现,保存的元素是一个pair类型{key, value},每个键值对应一个值,且键值唯一不可变,key值无序排列,支持用key进行随机存取,搜索速度比红黑树实现的map要快

unordered_multimap

与unordered_map基本一致,差别在于键值可以重复

容器适配器:均可以用vector, list和deque来实现,没有提供迭代器

名称

特性

stack

默认用deque来实现数据结构的栈的功能

queue

默认用deque来实现数据结构的队列的功能

priority_queue

默认用vector来实现,其中保存的元素按照某种严格弱序进行排列,队首元素总是值最大的

空间适配器allocator:C++ Primer 5th 中文版P427

allocator模板类定义在头文件memory.h中,它帮助我们将内存分配和对象构造分开来。它提供一种类型感知的内存分配方法,它分配的内存是原始的、未构造的。利用allocate方法分配一段内存,当利用allocator对象分配了内存以后,要再用construct方法来再这块内存中构造指定类型的对象。当使用完这块内存中的对象后,可以利用destroy方法来销毁这个对象,这块内存又变为原始的未构造的内存,可以再次在这块内存中构造指定类型的对象。当使用完这块内存后,要先销毁其中保存的对象,再利用deallocate方法销毁这块内存。

  • 算法:

STL算法部分主要由头文件<algorithm>,<numeric>,<functional>组成。要使用 STL中的算法函数必须包含头文件<algorithm>,对于数值算法须包含<numeric>,<functional>中则定义了一些模板类,用来声明函数对象。

STL中算法大致分为四类:

1)、非可变序列算法:指不直接修改其所操作的容器内容的算法。

2)、可变序列算法:指可以修改它们所操作的容器内容的算法。

3)、排序算法:包括对序列进行排序和合并的算法、搜索算法以及有序序列上的集合操作。

4)、数值算法:对容器内容进行数值计算。

以下对所有算法进行细致分类并标明功能:

<一>查找算法(13个)判断容器中是否包含某个值

adjacent_find: 在iterator对标识元素范围内,查找一对相邻重复元素,找到则返回指向这对元素的第一个元素的ForwardIterator。否则返回last。重载版本使用输入的二元操作符代替相等的判断。

binary_search: 在有序序列中查找value,找到返回true。重载的版本实用指定的比较函数对象或函数指针来判断相等。

count: 利用等于操作符,把标志范围内的元素与输入值比较,返回相等元素个数。

count_if: 利用输入的操作符,对标志范围内的元素进行操作,返回结果为true的个数。

equal_range: 功能类似equal,返回一对iterator,第一个表示lower_bound,第二个表示upper_bound。

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

find_end: 在指定范围内查找"由输入的另外一对iterator标志的第二个序列的最后一次出现。找到则返回最后一对的第一个ForwardIterator,否则返回输入的"另外一对"的第一个ForwardIterator。重载版本使用用户输入的操作符代替等于操作。

find_first_of: 在指定范围内查找"由输入的另外一对iterator标志的第二个序列"中任意一个元素的第一次出现。重载版本中使用了用户自定义操作符。

find_if: 使用输入的函数代替等于操作符执行find。

lower_bound: 返回一个ForwardIterator,指向在有序序列范围内的可以插入指定值而不破坏容器顺序的第一个位置。重载函数使用自定义比较操作。

upper_bound: 返回一个ForwardIterator,指向在有序序列范围内插入value而不破坏容器顺序的最后一个位置,该位置标志一个大于value的值。重载函数使用自定义比较操作。

search: 给出两个范围,返回一个ForwardIterator,查找成功指向第一个范围内第一次出现子序列(第二个范围)的位置,查找失败指向last1。重载版本使用自定义的比较操作。

search_n: 在指定范围内查找val出现n次的子序列。重载版本使用自定义的比较操作。

<二>排序和通用算法(14个)提供元素排序策略

inplace_merge: 合并两个有序序列,结果序列覆盖两端范围。重载版本使用输入的操作进行排序。

merge: 合并两个有序序列,存放到另一个序列。重载版本使用自定义的比较。

nth_element: 将范围内的序列重新排序,使所有小于第n个元素的元素都出现在它前面,而大于它的都出现在后面。重载版本使用自定义的比较操作。

partial_sort: 对序列做部分排序,被排序元素个数正好可以被放到范围内。重载版本使用自定义的比较操作。

partial_sort_copy: 与partial_sort类似,不过将经过排序的序列复制到另一个容器。

partition: 对指定范围内元素重新排序,使用输入的函数,把结果为true的元素放在结果为false的元素之前。

random_shuffle: 对指定范围内的元素随机调整次序。重载版本输入一个随机数产生操作。

reverse: 将指定范围内元素重新反序排序。

reverse_copy: 与reverse类似,不过将结果写入另一个容器。

rotate: 将指定范围内元素移到容器末尾,由middle指向的元素成为容器第一个元素。

rotate_copy: 与rotate类似,不过将结果写入另一个容器。

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

stable_sort: 与sort类似,不过保留相等元素之间的顺序关系。

stable_partition: 与partition类似,不过不保证保留容器中的相对顺序。

<三>删除和替换算法(15个)

copy: 复制序列

copy_backward: 与copy相同,不过元素是以相反顺序被拷贝。

iter_swap: 交换两个ForwardIterator的值。

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

remove_copy: 将所有不匹配元素复制到一个制定容器,返回OutputIterator指向被拷贝的末元素的下一个位置。

remove_if: 删除指定范围内输入操作结果为true的所有元素。

remove_copy_if: 将所有不匹配元素拷贝到一个指定容器。

replace: 将指定范围内所有等于vold的元素都用vnew代替。

replace_copy: 与replace类似,不过将结果写入另一个容器。

replace_if: 将指定范围内所有操作结果为true的元素用新值代替。

replace_copy_if: 与replace_if,不过将结果写入另一个容器。

swap: 交换存储在两个对象中的值。

swap_range: 将指定范围内的元素与另一个序列元素值进行交换。

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

unique_copy: 与unique类似,不过把结果输出到另一个容器。

<四>排列组合算法(2个)提供计算给定集合按一定顺序的所有可能排列组合

next_permutation: 取出当前范围内的排列,并重新排序为下一个字典序排列。重载版本使用自定义的比较操作。

prev_permutation: 取出指定范围内的序列并将它重新排序为上一个字典序排列。如果不存在上一个序列则返回false。重载版本使用自定义的比较操作。

<五>算术算法(4个)

accumulate: iterator对标识的序列段元素之和,加到一个由val指定的初始值上。重载版本不再做加法,而是传进来的二元操作符被应用到元素上。

partial_sum: 创建一个新序列,其中每个元素值代表指定范围内该位置前所有元素之和。重载版本使用自定义操作代替加法。

inner_product: 对两个序列做内积(对应元素相乘,再求和)并将内积加到一个输入的初始值上。重载版本使用用户定义的操作。

adjacent_difference: 创建一个新序列,新序列中每个新值代表当前元素与上一个元素的差。重载版本用指定二元操作计算相邻元素的差。

<六>生成和异变算法(6个)

fill: 将输入值赋给标志范围内的所有元素。

fill_n: 将输入值赋给first到first+n范围内的所有元素。

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

generate: 连续调用输入的函数来填充指定的范围。

generate_n: 与generate函数类似,填充从指定iterator开始的n个元素。

transform: 将输入的操作作用与指定范围内的每个元素,并产生一个新的序列。重载版本将操作作用在一对元素上,另外一个元素来自输入的另外一个序列。结果输出到指定容器。

<七>关系算法(8个)

equal: 如果两个序列在标志范围内元素都相等,返回true。重载版本使用输入的操作符代替默认的等于操作符。

includes: 判断第一个指定范围内的所有元素是否都被第二个范围包含,使用底层元素的<操作符,成功返回true。重载版本使用用户输入的函数。

lexicographical_compare: 比较两个序列。重载版本使用用户自定义比较操作。

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

max_element: 返回一个ForwardIterator,指出序列中最大的元素。重载版本使用自定义比较操作。

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

min_element: 返回一个ForwardIterator,指出序列中最小的元素。重载版本使用自定义比较操作。

mismatch: 并行比较两个序列,指出第一个不匹配的位置,返回一对iterator,标志第一个不匹配元素位置。如果都匹配,返回每个容器的last。重载版本使用自定义的比较操作。

<八>集合算法(4个)

set_union: 构造一个有序序列,包含两个序列中所有的不重复元素。重载版本使用自定义的比较操作。

set_intersection: 构造一个有序序列,其中元素在两个序列中都存在。重载版本使用自定义的比较操作。

set_difference: 构造一个有序序列,该序列仅保留第一个序列中存在的而第二个中不存在的元素。重载版本使用自定义的比较操作。

set_symmetric_difference: 构造一个有序序列,该序列取两个序列的对称差集(并集-交集)。

<九>堆算法(4个)

make_heap: 把指定范围内的元素生成一个堆。重载版本使用自定义比较操作。

pop_heap: 并不真正把最大元素从堆中弹出,而是重新排序堆。它把first和last-1交换,然后重新生成一个堆。可使用容器的back来访问被"弹出"的元素或者使用pop_back进行真正的删除。重载版本使用自定义的比较操作。

push_heap: 假设first到last-1是一个有效堆,要被加入到堆的元素存放在位置last-1,重新生成堆。在指向该函数前,必须先把元素插入容器后。重载版本使用指定的比较操作。

sort_heap: 对指定范围内的序列重新排序,它假设该序列是个有序堆。重载版本使用自定义比较操作。

  • 迭代器(iterator):

1. STL容器中只有顺序容器关联容器支持迭代器遍历,行为类似于指针,用于指向容器内的元素,并通过解引用*符号来获取元素。

2. 所有容器的迭代器都支持==和!=运算符;一般都支持++和--运算符(forward_list不支持--运算符);除了无序关联容器以外,其它容器的迭代器均支持<, <=, >, >=运算符。

3. 一个迭代器范围由一对迭代器表示,第一个迭代器指向范围内第一个元素,第二个迭代器指向范围内最后一个元素的下一个位置,是一个左闭右开区间[begin, end)。如果begin和end相等,则范围为空;如果begin和end不等,则范围至少包含一个元素,且begin指向第一个元素;begin递增若干次可以==end。

4. 每种容器都有指向首元素的begin()和指向尾后位置的end()迭代器,类型类似于vector<int>::iterator;另外还有对应的const版本的迭代器cbegin()和cend(),类型类似于vector<int>::const_iterator。

5. 反向迭代器,仅能反向迭代的容器支持。rbegin()指向末尾的第一个元素,rend()指向首元素的前一个位置,crbegin()和crend()分别为对应的const版本。类型为reverse_iterator以及其const版本const_reverse_iterator。

6. 所有容器支持的迭代器类型:

容器名称

支持的迭代器类型

vector

随机访问迭代器

deque

随机访问迭代器

list

双向迭代器

array

随机访问迭代器

forword_list

前向迭代器

stack

不支持

queue

不支持

priority_queue

不支持

set

双向迭代器

multiset

双向迭代器

map

双向迭代器

multimap

双向迭代器

[UE4]C++ STL总结的更多相关文章

  1. 3D游戏开发之在UE4中创建非玩家角色(NPC)

    接着上节我们继续学习,现在我们来创建一些NPC(non-playable characters,非玩家角色).在这个游戏中,当我们靠近NPC时,它们会做出相应的反应. 一 创建C++类 1) 在UE编 ...

  2. [UE4]动态数组:TArray容器

    为什么使用UE4提供的容器类? 如果你用过C++的STL库,你就知道STL提供了各种各样的容器/数据结构,使得你对处理很多数据的时候非常快捷高效.UE4同样也提供了类似的库,库里面的类型是以T开头的, ...

  3. 【摸鱼向】UE4的AI模块探索手记(1)

    前言 之前实现了自主创作的角色导入进UE4并成功控制其进行一系列动作,但目前的样子距离基本的游戏架构还差了一个很大的模块:NPC,而这部分是由电脑来进行自动控制,所以,我有一句话不知当讲不当讲(对,我 ...

  4. UE4新手引导之下载和安装虚幻4游戏引擎

    1) 进入虚幻4的官方主页(https://www.unrealengine.com/) 这里你可以获得关于虚幻4的最新资讯,包括版本更新.博客更新.新闻和商城等.自2015年起,该引擎已经提供免费下 ...

  5. UE4新手引导入门教程

    请大家去这个地址下载:file:///D:/UE4%20Doc/虚幻4新手引导入门教程.pdf

  6. 详细解说 STL 排序(Sort)

    0 前言: STL,为什么你必须掌握 对于程序员来说,数据结构是必修的一门课.从查找到排序,从链表到二叉树,几乎所有的算法和原理都需要理解,理解不了也要死记硬背下来.幸运的是这些理论都已经比较成熟,算 ...

  7. STL标准模板库(简介)

    标准模板库(STL,Standard Template Library)是C++标准库的重要组成部分,包含了诸多在计算机科学领域里所常见的基本数据结构和基本算法,为广大C++程序员提供了一个可扩展的应 ...

  8. STL的std::find和std::find_if

    std::find是用来查找容器元素算法,但是它只能查找容器元素为基本数据类型,如果想要查找类类型,应该使用find_if. 小例子: #include "stdafx.h" #i ...

  9. STL: unordered_map 自定义键值使用

    使用Windows下 RECT 类型做unordered_map 键值 1. Hash 函数 计算自定义类型的hash值. struct hash_RECT { size_t operator()(c ...

随机推荐

  1. 20165210 Java第八周学习总结

    20165210 Java第八周学习总结 教材内容学习 - 第十二章学习总结 进程与线程 操作系统与进程 Java中的线程 Java的多线程机制 主线程 线程的状态与生命周期 1. 新建 2. 运行 ...

  2. L224 词汇题

    Elaborate 精心的 preparations were being made for the Prime Minister’s official visit to the four forei ...

  3. Linux:查看进程运行时间

    查看进程运行时间 应用ps命令,加选项-Ao,加参数,最后过滤. ps -Ao pid,tty,user,stime,etime,comm,args| grep firefox pid:进程ID tt ...

  4. django model 不设置default='' 会出错

    当django中的model没有设置default = ''时,会弹出提示信息.在model中加上默认值为空,这样就不会对数据库的必填字段留空造成错误,导致数据库出错,系统崩溃.

  5. Centos中查看系统信息的常用命令

    系统日志文件(可以通过cat或tail命令来查看) /var/log/message 系统启动后的信息和错误日志,是Red Hat Linux中最常用的日志之一 /var/log/secure 与安全 ...

  6. SpringAop与AspectJ

    AspectJ AspectJ是一个面向切面的框架,它扩展了Java语言.AspectJ定义了AOP语法,所以它有一个专门的编译器用来生成遵守Java字节编码规范的Class文件. spring ao ...

  7. react 部分ES6写法

    react+react-router+antd 栗子:https://github.com/Aquarius1993/reactApp 模块: 1. 引入模块 import React from 'r ...

  8. Java第十次作业--多线程

    一.学习要点 认真看书并查阅相关资料,掌握以下内容: 理解进程和线程的区别 掌握Java多线程的两种实现方式和区别 理解线程对象的生命周期 熟悉线程控制的基本方法 掌握Java线程的同步机制 理解多线 ...

  9. 在intent-filter中的配置

    1.scheme约束和mimetype的数据类型,这些都可以自己去定义. 2.但是由于在MainActivity却不能直接将这两个参数分开来写,例如setdata和settype,这样会互相删除. 因 ...

  10. [LeetCode&Python] Problem 804. Unique Morse Code Words

    International Morse Code defines a standard encoding where each letter is mapped to a series of dots ...