STL各种函数详细讲解

合集下载

stl标准库函数

stl标准库函数

stl标准库函数C++标准库是C++编程中非常重要的部分,其中最重要的组件之一就是STL(Standard Template Library)标准模板库。

STL为C++程序员提供了一系列功能强大的数据结构和算法,极大地简化了程序的开发过程。

在本文中,我们将讨论一些常用的STL库函数,并解释它们的用法和特点。

1.容器类STL提供了多个容器类,如vector、list、deque、map、set等。

这些容器类分别适用于不同类型的数据结构和操作。

比如,vector是一个动态数组,可以实现快速的随机访问;list是一个双向链表,可以实现方便的插入和删除操作。

示例使用方式:```cpp#include <vector>#include <list>#include <iostream>int maistd::vector<int> vec = {1, 2, 3, 4, 5};std::list<std::string> lst = {"apple", "banana", "cherry"};//访问元素std::cout << vec[2] << std::endl;std::cout << lst.front( << std::endl;//插入元素vec.push_back(6);lst.push_front("orange");//删除元素vec.erase(vec.begin( + 1);lst.pop_back(;return 0;```2.算法函数STL提供了大量的算法函数,比如sort、find、transform等,这些函数可以用于对容器中的元素进行排序、查找、转换等操作。

这些算法函数具有高效、通用和可复用的特点。

STL基础教程

STL基础教程

STL基础教程目录1. STL概论 (4)1.1 STL基本概念 (4)1.2 STL六大组件简介 (5)1.3 STL优点 (6)2. STL三大组件 (7)2.1 容器 (7)2.2 算法 (8)2.3 迭代器 (9)2.3 案例 (10)3. 常用容器 (12)3.1 string容器 (12)3.1.1 string容器基本概念 (12)3.1.2 string容器常用操作 (13)3.1.3 小练习 (16)3.2 vector容器 (16)3.2.1 vector容器基本概念 (16)3.2.2 vector迭代器 (17)3.2.3 vector的数据结构 (18)3.2.4 vector常用API操作 (19)3.2.5 vector小案例 (20)3.3 deque容器 (22)3.3.1 deque容器基本概念 (22)3.3.2 deque容器实现原理 (23)3.3.3 deque常用API (24)3.4.1 stack容器基本概念 (26)3.4.2 stack没有迭代器 (27)3.4.3 stack常用API (27)3.5 queue容器 (28)3.5.1 queue容器基本概念 (28)3.5.2 queue没有迭代器 (29)3.5.3 queue常用API (29)3.6 list容器 (30)3.6.1 list容器基本概念 (30)3.6.2 list容器的迭代器 (31)3.6.3 list容器的数据结构 (32)3.6.4 list常用API (33)3.7 set/multiset容器 (35)3.7.1 set/multiset容器基本概念 (35)3.7.2 set常用API (37)3.7.3 对组(pair) (40)3.8 map/multimap容器 (41)3.8.1 map/multimap基本概念 (41)3.8.2 map/multimap常用API (41)3.8.3 multimap案例 (43)3.9 STL容器使用时机 (47)4. 常用算法 (49)4.1 函数对象 (49)4.2 谓词 (51)4.3 内建函数对象 (52)3.1.4 函数对象适配器 (54)4.2 算法概述 (58)4.3 常用遍历算法 (58)4.4 常用查找算法 (62)4.6 常用拷贝和替换算法 (64)4.7 常用算数生成算法 (65)4.8 常用集合算法 (66)5. STL综合案例(学校演讲比赛) (67)演讲比赛案例 (67)比赛规则: (67)需求分析: (69)实现思路: (69)1. STL概论长久以来,软件界一直希望建立一种可重复利用的东西,以及一种得以制造出”可重复运用的东西”的方法,让程序员的心血不止于随时间的迁移,人事异动而烟消云散,从函数(functions),类别(classes),函数库(function libraries),类别库(class libraries)、各种组件,从模块化设计,到面向对象(object oriented ),为的就是复用性的提升。

stl常用函数

stl常用函数

stl常用函数STL(StandardTemplateLibrary)是C++标准库中的一个重要部分,它提供了许多常用的数据结构和算法,方便了程序员的开发工作。

在STL中,有许多常用的函数,本文将介绍一些常用的STL函数。

1. vectorvector是STL中最常用的容器之一,它是一个动态数组,可以方便地进行插入、删除等操作。

下面是一些常用的vector函数:1.1 push_backpush_back函数用于在vector的末尾添加一个元素,例如:```c++vector<int> vec;vec.push_back(1);vec.push_back(2);vec.push_back(3);```这样,vec中就包含了1、2、3这三个元素。

1.2 pop_backpop_back函数用于删除vector末尾的一个元素,例如:```c++vector<int> vec;vec.push_back(1);vec.push_back(2);vec.push_back(3);vec.pop_back();```这样,vec中就只包含了1、2这两个元素。

1.3 sizesize函数用于返回vector中元素的个数,例如: ```c++vector<int> vec;vec.push_back(1);vec.push_back(2);vec.push_back(3);cout << vec.size() << endl;```输出结果为3。

1.4 clearclear函数用于清空vector中的所有元素,例如: ```c++vector<int> vec;vec.push_back(1);vec.push_back(2);vec.push_back(3);vec.clear();```这样,vec就不包含任何元素了。

2. listlist是STL中另一个常用的容器,它是一个双向链表,可以方便地进行插入、删除等操作。

使用STL指令的编程方法

使用STL指令的编程方法

使用STL指令的编程方法一、STL/RET 指令STL 指令可以使编程者生成流程和工作与顺序功能图非常接近的程序。

STL 指令的意义为激活某个步(即状态),在梯形图上体现为从主母线上引出的状态接点。

STL 指令有建立子母线的功能,从而使该状态的所有操作均在子母线上进行。

步进返回指令 RET 是指状态流程结束,用于返回主母线。

一般 FX 系列 plc 采用状态器 S 编制顺控程序,并与 STL 指令一起使用。

1. 顺序功能图和步进梯形图之间的转换使用步进梯形指令 STL 和步进返回指令 RET 可以将顺序功能图转换为步进梯形图,其对应关系如下图所示。

( a )顺序功能图( b )梯形图( c )指令表图顺序功能图与梯形图的对应关系ST L 触点驱动的电路块有 3 个功能:①对负载的驱动处理,即在这一步要做什么;②指定转移条件,即满足该条件则退出这一步;③指定转移目标,即下一步状态是什么。

2. 步进梯形图编程规则(1 )初始步可由其它步驱动,但运行开始时必须用其它方法预先作好驱动,否则状态流程不可能向下进行。

(2 )步进梯形图编程顺序为:先进行驱动,后进行转移。

二者的顺序不能颠倒。

( 3 )编程时必须使用 STL 指令对应于每一个顺序功能图上的步。

( 4 )各 STL 触点的驱动电路一般放在一起,最后一个 STL 电路结束时,一定要使用步进返回指令 RET 使其返回主母线。

( 5 ) STL 触点可以直接驱动也可以通过别的触点驱动,如 Y 、M 、 S 、 T 、 C 等元件的线圈和应用指令。

( 6 )驱动负载使用 OUT 指令,当同一负载需要连续多步驱动时可使用多重输出,也可使用SET 指令将负载置位,等到负载不需要驱动时再用 RST 指令将其复位。

( 7 )由于 CPU 只执行活动步对应的电路块,因此使用 STL 指令时允许“双线圈”输出,即不同的STL 触点可以分别驱动同一编程元件的一个线圈。

STL(标准模板库)基本概念

STL(标准模板库)基本概念

STL(标准模板库)基本概念⼀、什么是STLSTL(Standard Template Library,标准模板库)的从⼴义上讲分为三类:algorithm(算法)、container(容器)和iterator(迭代器),容器和算法通过迭代器可以进⾏⽆缝地连接。

⼏乎所有的代码都采⽤了模板类和模板函数的⽅式,这相⽐于传统的由函数和类组成的库来说提供了更好的代码重⽤机会。

在C++标准中,STL被组织为下⾯的13个头⽂件:<algorithm>、<deque>、<functional>、<iterator>、<vector>、<list>、<map>、<memory>、<numeric>、<queue>、<set>、<stack> 和<utility>。

STL详细的说六⼤组件– 容器(Container)– 算法(Algorithm)– 迭代器(Iterator)– 仿函数(Function object)– 适配器(Adaptor)– 空间配制器(allocator)使⽤STL的好处1)STL是C++的⼀部分,因此不⽤额外安装什么,它被内建在你的编译器之内。

2)STL的⼀个重要特点是数据结构和算法的分离。

尽管这是个简单的概念,但是这种分离确实使得STL变得⾮常通⽤。

例如,在STL的vector容器中,可以放⼊元素、基础数据类型变量、元素的地址;STL的sort()函数可以⽤来操作vector,list等容器。

1)程序员可以不⽤思考STL具体的实现过程,只要能够熟练使⽤STL就OK了。

这样他们就可以把精⼒放在程序开发的别的⽅⾯。

2) STL具有⾼可重⽤性,⾼性能,⾼移植性,跨平台的优点。

⾼可重⽤性:STL中⼏乎所有的代码都采⽤了模板类和模版函数的⽅式实现,这相⽐于传统的由函数和类组成的库来说提供了更好的代码重⽤机会。

STL六大组件

STL六大组件

STL六⼤组件容器(Container)算法(Algorithm)迭代器(Iterator)仿函数(Function object)适配器(Adaptor)空间配置器(allocator)1、容器作为STL的最主要组成部分--容器,分为向量(vector),双端队列(deque),表(list),队列(queue),堆栈(stack),集合(set),多重集合(multiset),映射(map),多重映射(multimap)。

容器特性所在头⽂件<vector>向量vector可以⽤常数时间访问和修改任意元素,在序列尾部进⾏插⼊和删除时,具有常数时间复杂度,对任意项的插⼊和删除就有的时间复杂度与到末尾的距离成正⽐,尤其对向量头的添加和删除的代价是惊⼈的⾼的<deque>双端队列deque基本上与向量相同,唯⼀的不同是,其在序列头部插⼊和删除操作也具有常量时间复杂度<list>表list对任意元素的访问与对两端的距离成正⽐,但对某个位置上插⼊和删除⼀个项的花费为常数时间。

<queue>队列queue插⼊只可以在尾部进⾏,删除、检索和修改只允许从头部进⾏。

按照先进先出的原则。

<stack>堆栈stack堆栈是项的有限序列,并满⾜序列中被删除、检索和修改的项只能是最近插⼊序列的项。

即按照后进先出的原则<set>集合set由节点组成的红⿊树,每个节点都包含着⼀个元素,节点之间以某种作⽤于元素对的谓词排列,没有两个不同的元素能够拥有相同的次序,具有快速查找的功能。

但是它是以牺牲插⼊删除操作的效率为代价的<set>多重集合multiset和集合基本相同,但可以⽀持重复元素具有快速查找能⼒<map>映射map由{键,值}对组成的集合,以某种作⽤于键对上的谓词排列。

具有快速查找能⼒<map>多重集合multimap⽐起映射,⼀个键可以对应多了值。

STL讲解

STL讲解
}
Map映射
映射,顾名思义就是一个数映射(指向)另一个数,或者几个数映射一个数。 比如:13 (1映射3); (1,2)3 ( (1,2)这对数映射到3上),但是不能多重映射,即 13,然后不能再有12这个关系了; 而multimap也是映射,但是允许多重映射,比如上面说的1可以映射到3,也可以同时映 射到2上。 如: map[键]=值。这种形式就是映射关系(看起来与一维数组很像,很多时候可以作为一 维数组使用,哈哈……) Map中的键值默认是从小到大排序的。 他们的成员函数都是一样的(和set与multiset的关系相似,可能有的函数返回值不一样) : begin() 返回指向map头部的迭代器 clear() 删除所有元素 count() 返回指定元素出现的次数 empty() 如果map为空则返回true end() 返回指向map末尾的迭代器 erase() 删除一个元素 find() 查找一个元素 insert() 插入元素 size() 返回map中元素的个数 swap() 交换两个map lower_bound() 返回键值>=给定元素的第一个位置 upper_bound() 返回键值>给定元素的第一个位置
vector
成员函数: 举例:vector<int> c ; c.back() 传回最后一个数据,不检查这个数据是否存在。 c.begin() 传回迭代器中的第一个数据地址。 c.clear() 移除容器中所有数据。 c.empty() 判断容器是否为空。 c.end() // 指向迭代器中末端元素的下一个,指向一个不存在元素。 c.erase(pos) // 删除pos位置的数据,传回下一个数据的位置。 c.erase(beg,end) 删除[beg,end)区间的数据,传回下一个数据的位置。 c.front() 传回第一个数据。 c.insert(pos,elem) // 在pos位置插入一个elem拷贝,传回新数据位置 c.insert(pos,n,elem) // 在pos位置插入n个elem数据,无返回值 c.insert(pos,beg,end) // 在pos位置插入在[beg,end)区间的数据。无返回值 c.max_size() 返回容器中最大数据的数量。 c.pop_back() 删除最后一个数据。 c.push_back(elem) 在尾部加入一个数据。 c.resize(num) 重新指定队列的长度。 c.reserve() 保留适当的容量。 c.size() 返回容器中实际数据的个数。

西门子STL的解释精华

西门子STL的解释精华

举例:
L #P_SET //装入符号名为#P_Set的变量到ACCU1中
L 1 //将数值1装入ACCU1中,原ACCU1中的数据#P_Set送入ACCU2
-I //ACCU2-ACCU1,结果放在ACCU1中
L 12 //和上面的意思相同
*I //做乘法
//以下代码雷同
L #P_ACT
+I
L 1
-I
L 2
*I //做到这一步时,以上代码相当于执行了表达式:
//[(#P_SET-1)*12+#P_ACT-1]*2
ITD //将结果转换为长整型数据
SLD 3 //左移3位,成为X.X格式,也就是32位指针格式
T #TEMP0 //将转换后的结果送入变量#Temp0中
OPN #DB_NO //打开块号为#DB_NO的数据块
L DBW [#TEMP0] //装入DBW,对于间接寻址来说,地址值必须为32位指针格式~~
T DBW 290 //将寻到的地址中的值送入DBW290中。

如果无STL编程经验,建议认真学习西门子的STL编程手册,并从论坛下载资料后要认真阅读消化!。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
要组成部分。STL 以模板类和模板函数的形式为程序员提供了各种数
据结构和
算法的精巧实现,程序员如果能够充分地利用 STL,可以在代码空间、 执行时 间和编码效率上获得极大的好处。 STL 大致可以分为三大类:算法(algorithm)、容器(container)、迭 代器
(iterator)。 STL 容器是一些模板类,提供了多种组织数据的常用方法,例如 vector(向量,类似于数组)、list(列表,类似于链表)、deque(双向 队列)、set(集合)、map(映象)、stack(栈)、queue(队列)、 priority_queue(优先队列)等,通过模板的参数我们可以指定容器中 的元素类型。 STL 算法是一些模板函数,提供了相当多的有用算法和操作,从简单 如 for_each(遍历)到复杂如 stable_sort(稳定排序)。 STL 迭代器是对 C 中的指针的一般化,用来将算法和容器联系起来。 几乎所有的 STL 算法都是通过迭代器来存取元素序列进行工作的, 而 STL 中的每一个容器也都定义了其本身所专有的迭代器,用以存 取容器中的元素。有趣的是,普通的指针也可以像迭代器一样工作。 熟悉了 STL 后,你会发现,很多功能只需要用短短的几行就可以实 现了。通过 STL,我们可以构造出优雅而且高效的代码,甚至比你自 己手工实现的代码效果还要好。 STL 的另外一个特点是,它是以源码方式免费提供的,程序员不仅可 以自由地使用这些代码,也可以学习其源码,甚至按照自己的需要去 修改它。 下面是用 STL 写的题 Ugly Numbers 的代码: #include <iostream> #include <queue> using namespace std; typedef pair<unsigned long, int> node_type; int main(){ unsigned long result[1500]; priority_queue< node_type, vector<node_type>,greater<node_type> > Q; Q.push( make_pair(1, 2) ); for (int i=0; i<1500; i++){ node_type node = Q.top(); Q.pop(); switch(node.second){ case 2: Q.push( make_pair(node.first*2, 2) ); case 3: Q.push( make_pair(node.first*3, 3) ); case 5: Q.push( make_pair(node.first*5, 5) ); }
vector<int> s;定义一个空的 vector 对象,存储的是 int 类型的元 素。 vector<int> s(n);定义一个含有 n 个 int 元素的 vector 对象。 vector<int> s(first, last);定义一个 vector 对象,并从由迭代 器 first 和 last 定义的序列[first,last)中复制初值。 vector 的基本操作有: s[i]直接以下标方式访问容器中的元素。 s.front() 返回首元素。 s.back() 返回尾元素。 s.push_back(x) 向表尾插入元素 x。 s.size() 返回表长。 s.empty() 当表空时,返回真,否则返回假。 s.pop_back() 删除表尾元素。 s.begin() 返回指向首元素的随机存取迭代器。 s.end() 返回指向尾元素的下一个位置的随机存取迭代器。 s.insert(it, x) 向迭代器 it 指向的元素前插入新元素 val。 s.insert(it, n, x) 向迭代器 it 指向的元素前插入 n 个 x。 s.insert(it, first, last) 将由迭代器 first 和 last 所指定的序 列[first, last)插入到迭代器 it 指向的元素前面。 s.erase(it)删除由迭代器 it 所指向的元素。 s.erase(first, last) 删除由迭代器 first 和 last 所__________ 指定的序列[first, last)。 s.reserve(n) 预分配缓冲空间,使存储空间至少可容纳 n 个元素。 s.resize(n) 改变序列的长度,超出的元素将会被删除,如果序列需要扩展(原空 间小于 n), 元素默认值将填满扩展出的空间。 s.resize(n, val) 改变序列的长度,超出的元素将会被删除,如果序列需要扩展(原空 间小于 n), 将用 val 填满扩展出的空间。 s.clear() 删除容器中的所有的元素。 s.swap(v)
result[i] = node.first; } int n; cin >> n; while (n>0){ cout << result[n-1] << endl; cin >> n; } return 0; } 在 ACM 竞赛中,熟练掌握和运用 STL 对快速编写实现代码会有极大 的帮助。 二、使用 STL 在 C++标准中,STL 被组织为以下的一组头文件(注意,是没有.h 后 缀的!): algorithm / deque / functional / iterator / list / map memory / numeric / queue / set / stack / utility / vector 当我们需要使用 STL 的某个功能时,需要嵌入相应的头文件。但要 注意的是, 在 C++标准中,STL 是被定义在 std 命名空间中的。如下例所示: #include <stack> int main(){ std::stack<int> s; s.push(0); ... return 0; } 如果希望在程序中直接引用 STL,也可以在嵌入头文件后,用 using namespace 语句将 std 命名空间导入。如下例所示: #include <stack> using namespace std; int main(){ stack<int> s; s.push(0); ...
| 全排列函数 next_permutation STL 中专门用于排列的函数(可以处理存在重复数据集的排列问题) 头文件:#include <algorithm> using namespace std; 调用: next_permutation(start, end); 注意:函数要求输入的是一个升序排列的序列的头指针和尾指针. 用法: // 数组 int a[N]; sort(a, a+N); next_permutation(a, a+N); // 向量 vector<int> ivec; sort(ivec.begin(), ivec.end()); next_permutation(ivec.begin(), ivec.end()); 例子: vector<int> myVec; // 初始化代码 sort(myVec.begin(),myVec.end()); do{ for (i = 0 ;i < size;i ++ ) cout << myVec[i] << " /t " ; cout << endl; }while (next_permutation(myVec.begin(), myVec.end())); ACM/ICPC 竞赛之 STL 简介 一、关于 STL STL(Standard Template Library,标准模板库)是 C++语言标准中 的重
priority_queue< node_type, vector<node_type>,greater<node_type> > Q; Q.push( make_pair(1, 2) ); for (int i=0; i<1500; i++){ node_type node = Q.top(); Q.pop(); switch(node.second){ case 2: Q.push( make_pair(node.first*2, 2) ); case 3: Q.push( make_pair(node.first*3, 3) ); case 5: Q.push( make_pair(node.first*5, 5) ); } result[i] = node.first; } int n; cin >> n; while (n>0){ cout << result[n-1] << endl; cin >> n; } return 0; } <utility>看上去是很简单的一个头文件,但是<utility>的设计中却 浓缩 反映了 STL 设计的基本思想。有意深入了解和研究 STL 的同学,仔 细阅读和体会这个简单的头文件,不失为一种入门的途径。 ACM/ICPC 竞赛之 STL--vector 在 STL 的<vector>头文件中定义了 vector(向量容器模板类), vector 容器以连续数组的方式存储元素序列,可以将 vector 看作是以顺序 结构实现的线性表。当我们在程序中需要使用动态数组时,vector 将 会是理想的选择,vector 可以在使用过程中动态地增长存储空间。 vector 模板类需要两个模板参数,第一个参数是存储元素的数据类 型,第二个参数是存储分配器的类型,其中第二个参数是可选的,如 果不给出第二个参数,将使用默认的分配器。 下面给出几个常用的定义 vector 向量对象的方法示例:
相关文档
最新文档