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编程手册,并从论坛下载资料后要认真阅读消化!。

c++ stl erase函数

c++ stl erase函数

C++ STL中的erase函数是一个非常重要的函数,它能够在容器中删除指定位置的元素。

在本文中,我们将深入探讨erase函数的用法、作用和实际应用场景,并从简单到复杂地介绍相关知识。

1. 概述在C++ STL中,erase函数是用来删除容器中指定位置的元素的函数。

它可以用于vector、list、map等各种容器,是对容器进行操作的重要工具之一。

2. 基本用法在使用erase函数时,我们需要指定要删除的元素的位置。

对于vector容器来说,我们可以这样使用erase函数:```c++vector<int> vec = {1, 2, 3, 4, 5};vec.erase(vec.begin() + 2); // 删除第三个元素,即3```上述代码中,我们使用了vec.begin() + 2来指定要删除的位置,即第三个元素,然后调用erase函数进行删除。

3. 迭代器失效问题在使用erase函数时,我们需要注意迭代器的失效问题。

因为erase 函数会导致元素的移动和容器大小的改变,所以在删除元素后,原来的迭代器就会失效。

这时,我们需要重新定位迭代器的位置,以免出现指向已经删除的元素的情况。

4. 删除范围除了删除单个指定位置的元素外,erase函数还可以用于删除一个范围内的元素。

例如:```c++vector<int> vec = {1, 2, 3, 4, 5};vec.erase(vec.begin() + 1, vec.begin() + 4); // 删除第二个到第四个元素```上述代码中,我们使用了两个迭代器来指定要删除的范围,即第二个到第四个元素。

5. 应用场景erase函数在实际应用中有很多场景。

当我们需要从容器中删除指定条件的元素时,可以结合erase和remove_if函数来实现。

又或者在使用map容器时,我们可以使用erase来删除指定键对应的值。

6. 个人观点对于erase函数,我认为它是C++ STL中非常实用的函数之一。

stl源码剖析pdf

stl源码剖析pdf

STL源码剖析STL(Standard Template Library)是C++标准库中的一部分,它提供了一系列的模板类和函数,用于操作各种数据结构和算法,包括vector、list、map、set等容器,以及sort、find、c ount等算法。

STL的设计思想是将数据结构和算法分离,使得用户可以通过简单的组合和调用,完成复杂的数据处理任务。

STL的源码实现是一个非常庞大和复杂的工程,涉及到各种数据结构、算法、模板技术、编译器优化等方面的知识。

本文将从几个方面来剖析STL的源码实现,包括容器、迭代器、算法等方面。

一、容器STL提供了多种容器,包括vector、list、deque、map、set等。

这些容器都是模板类,可以存储不同类型的数据,并且支持各种常用的操作,比如插入、删除、查找、排序等。

以vector为例,其源码实现主要包括以下几个部分:1. 构造函数和析构函数:vector的构造函数可以接受多种参数,比如默认构造函数、指定大小的构造函数、拷贝构造函数等。

析构函数用于释放vector占用的内存。

2. 迭代器:vector提供了多种迭代器,包括普通迭代器、反向迭代器、常量迭代器等。

迭代器是STL的核心概念之一,它可以让用户通过类似指针的方式来访问容器中的元素。

3. 容量和大小:vector提供了多种方法来查询容器的大小和容量,比如size()、capacity()、e mpty()等。

4. 插入和删除:vector提供了多种方法来插入和删除元素,比如push_back()、pop_back()、insert()、erase()等。

5. 访问元素:vector提供了多种方法来访问容器中的元素,比如at()、front()、back()等。

二、迭代器迭代器是STL的核心概念之一,它可以让用户通过类似指针的方式来访问容器中的元素。

S TL提供了多种迭代器,包括普通迭代器、反向迭代器、常量迭代器等。

Map和Stack的STL方法简介

Map和Stack的STL方法简介

Map和Stack的STL⽅法简介Map和Stack的STL⽅法简介c++Stack(堆栈)是⼀个容器类的改编,为程序员提供了堆栈的全部功能,————也就是说实现了⼀个先进后出的数据结构(FILO);需包含<stack>头⽂件;主要有⼀下⼏个函数:empty语法: bool empty();如当前堆栈为空,empty() 函数返回 true 否则返回false.pop语法: void pop();pop() 函数移除堆栈中最顶层元素。

size语法: size_type size();size() 函数返当前堆栈中的元素数⽬。

top语法: TYPE &top();top() 函数返回对栈顶元素的引⽤.可以通过它访问stack中的每个元素:i = s.size();while(i--)printf("%lf\n",*(&s.top()-i));⼀个简单的例⼦:#include <iostream>#include <Stack>using namespace std;void main(){stack<double> s;//可以是各种数据类型;for( int i=0; i < 10; i++ )s.push(i);while(!s.empty()){printf("%lf\n",s.top());s.pop();}cout << "This stack has a size of " << s.size() << endl;}C++ Maps是⼀种关联式容器,包含“关键字/值”对需包含头⽂件<Map>Map是STL的⼀个关联容器,它提供⼀对⼀(其中第⼀个可以称为关键字,每个关键字只能在map中出现⼀次,第⼆个可能称为该关键字的值)的数据处理能⼒,由于这个特性,它完成有可能在处理⼀对⼀数据时,在编程上提供快速通道。

STL常见函数总结

STL常见函数总结

STL常见函数总结#include<bitset>#include<deque>#include<list>#include<map>#include<set>#include<stack>#include<vector>#include<algorithm>#include<string>#include<queue>容器和算法顺序容器1 vector//支持快速随机访问vector<int> f,f1;vector<int>::iterator iter,q,h;int n,x;f.push_back(x);在尾部插入元素x,返回void;f.insert(iter,x);在iter前面插入x,返回指向新添加元素的迭代器;f.insert(iter,n,x);在iter前面插入n个x,返回void;f.insert(iter,q,h);在迭代器iter前面插入q和h范围内的所以元素; f.size(); 返回类型:vector<int>::size_type,也可直接用int,longf.empty();返回布尔值f.back();最后一个元素f.front();返回第一个元素f[n] 返回第n个元素f.erase(iter)删除iter指向的元素,返回所删除值后面的元素的迭代器,若删除的是最后一个元素返回f.end()一样的位置f.erase(q,h)删除q-h所有元素(包括q,不包括h),返回指向后面的的若h就是f.end(),还返回f.end();f.clear();清空所以元素,返回voidf.pop_back()删除最后一个元素,返回void可以直接赋值f1=f;可以直接比较大小f1=swap(f);f.assign(q,h);f先清空,然后把来自另一个vector的从q到h的元素复制进来f.assign(n,x);f先清空,然后赋为n个x2 list//支持快速插入删除,就是个链表f.push_front(x);不能用f[n]来访问f.pop_front();返回void3 deque//双端队列,两头都有vector的高效性质,还,可以实现元素的随机访问f.push_front(x);f[n];f.pop_front();返回void4 stack//后进先出栈s.empty()s.size()s.pop() 删除栈顶元素,不返回值s.top() 返回栈顶元素的值,但不删除栈顶元素s.push(x) 压栈5 queue//先进先出队列s.empty()s.size()s.pop()删除队首元素,不返回值s.front()返回队首值,但不删除s.back()返回队尾值,但不删除s.push(),在最后插入元素6 priority_queue //有优先级管理的队列s.empty()s.size()s.pop()删除队首元素,不返回值s.front()返回队首值,但不删除s.top()返回具有最高优先级的元素,但不删除s.push(),在适当位置插入新元素定义方法priority_queue<int,vector<int>,greater<int>>priority_queue<int,vector<int>,less<int>>priority_queue<int>7 string 和vector差不多其实,特殊的vector?int pos;char ch[100];getline(cin,s);s.insert(iter,t); iter前插ts.insert(iter,n,t); iter前n个插ts.insert(iter,q,h);s.earse(iter);s.earse(q,h);s.insert(pos,n,t);在pos前插入n个ts.insert(pos,s1); 在pos前插入s1s.earse(pos,n);删除pos开始的n个字符s.insert(pos,ch,n);s.insert(pos,ch);s.substr(pos,n);返回从pos开始的n个字符的字符串s.substr(pos);s.replace(pos.len.s1);删除pos开始的len个字符并以s1代替插进去s.replace(q,h,s1);s.find(s1) s1在s中第一次出现的位置s.rfind(s1) s1在s中最后一次出现的位置s.find_first_of(s1) 在s中查找s任意字符第一次出现s.find_last_of(s1) 在s中查找s任意字符最后一次出现s.find_first_not_of(s1)s.find_last_not_of(s1)每个s1都有四种重载版本 s1,pos(从pos开始找),s1,pos,n(匹配s1的前n个字母)string的比较:s==s1,s>s1,s<s1最一般的pare(s1)pare(pos,n,s1);s从pos开始的n个字符,同理,这里的s1也有多种重载版本关联容器1 map(键值对应),键要可排序类型map<string,int> f;map<string,int>::key_type 键的类型map<string,int>::mapped_type 值的类型map<string,int>::value_type pair类型,其中first为一个常量,而sencond 为一个可变量map中添加元素:直接下标添加:f["hello"]=2;(建立了键后首先赋值为0)(若原来有这个“hello”,则是修改了这个键对应的值)用insert添加新元素:f.insert(map<string,int>::value_type("hello",1));f.insert(make_pair("hello",1));insert(pair),返回一个pair类型( pair<map<string,int>::iteratro, bool> ret)对象,包括一个指向插入键的迭代器,和bool类型的判断是否插入的布尔值,如果键已经存在,就不插入了map中查找,读取元素下标读取有危险(如果没有会插入)f.count("hello") 返回”hello"出现的次数,对于map,返回的就是0或1 f.find("hello") 返回对应的迭代器,否则返回f.end()处删除元素:f.erase(),1传入键(返回0or1),2传入迭代器(void),3传入一对迭代器(void)2 setset<int> set1,set2;添加元素:set1.insert(x);set2.insert(set1.begin(),set1.end());set1.find(x);set1.count(x);set1.erase(x);1 bitsetbitset<100> f;f.any() 是否存在为1的二进制位f.none()f.size()f[n]f.test(n)f.set() 全部置为1f.set(n) 第n位置为1f.reset()全部置为0f.reset(n)f.flip()逐位取反f.flip(n)f.to_ulong()把它返回会unsigned long1 algorithmuniquefillfill_nreplacereplace_copyaccumulatesortstable_sortcount_if……。

STL中map、set的数据结构及底层实现

STL中map、set的数据结构及底层实现

STL中map、set的数据结构及底层实现摘要:本文列出几个基本的STL map和STL set的问题,通过解答这些问题讲解了STL关联容器内部的数据结构,最后提出了关于UNIX/LINUX自带平衡二叉树库函数和map, set 选择问题,并分析了map, set的优势之处。

对于希望深入学习STL和希望了解STL map 等关联容器底层数据结构的朋友来说,有一定的参考价值。

vector(向量)——STL中标准而安全的数组。

只能在vector 的“前面”增加数据。

deque(双端队列double-ended queue)——在功能上和vector相似,但是可以在前后两端向其中添加数据。

list(列表)——游标一次只可以移动一步。

如果你对链表已经很熟悉,那么STL中的list 则是一个双向链表(每个节点有指向前驱和指向后继的两个指针)。

set(集合)——包含了经过排序了的数据,这些数据的值(value)必须是唯一的。

map (映射)——经过排序了的二元组的集合,map中的每个元素都是由两个值组成,其中的key(键值,一个map中的键值必须是唯一的)是在排序或搜索时使用,它的值可以在容器中重新获取;而另一个值是该元素关联的数值。

比如,除了可以ar[43] = "overripe"这样找到一个数据,map还可以通过ar["banana"] = "overripe"这样的方法找到一个数据。

如果你想获得其中的元素信息,通过输入元素的全名就可以轻松实现。

multiset(多重集)——和集合(set)相似,然而其中的值不要求必须是唯一的(即可以有重复)。

multimap(多重映射)——和映射(map)相似,然而其中的键值不要求必须是唯一的(即可以有重复)。

STL map和set的使用虽不复杂,但也有一些不易理解的地方,如:# 为何map和set的插入删除效率比用其他序列容器高?# 为何每次insert之后,以前保存的iterator不会失效?# 为何map和set不能像vector一样有个reserve函数来预分配数据?# 当数据元素增多时(10000到20000个比较),map和set的插入和搜索速度变化如何?或许有得人能回答出来大概原因,但要彻底明白,还需要了解STL的底层数据结构。

stl库里的find函数用法

stl库里的find函数用法

stl库⾥的find函数⽤法1.string中find()返回值是字母在母串中的位置(下标记录),如果没有找到,那么会返回⼀个特别的标记npos。

(返回值可以看成是⼀个int 型的数)1 #include<cstring>2 #include<cstdio>3 #include<iostream>4 using namespace std;5 int main()6 {7 ////find函数返回类型 size_type8 string s("1a2b3c4d5e6f7jkg8h9i1a2b3c4d5e6f7g8ha9i");9 string flag;10 string::size_type position;11 //find 函数返回jk 在s 中的下标位置12 position = s.find("jk");13 if (position != s.npos) //如果没找到,返回⼀个特别的标志c++中⽤npos表⽰,我这⾥npos取值是4294967295,14 {15 printf("position is : %d\n" ,position);16 }17 else18 {19 printf("Not found the flag\n");20 }21 }2.返回⼦串出现在母串中的⾸次出现的位置,和最后⼀次出现的位置。

1 flag = "c";2 position = s.find_first_of(flag);3 printf("s.find_first_of(flag) is :%d\n",position);4 position = s.find_last_of(flag);5 printf("s.find_last_of(flag) is :%d\n",position);3.查找某⼀给定位置后的⼦串的位置1 //从字符串s 下标5开始,查找字符串b ,返回b 在s 中的下标2 position=s.find("b",5);3 cout<<"s.find(b,5) is : "<<position<<endl;4.查找所有⼦串在母串中出现的位置//查找s 中flag 出现的所有位置。

STL之map与pair与unordered_map常用函数详解

STL之map与pair与unordered_map常用函数详解

STL 之map 与pair 与unordered_map 常⽤函数详解STL 之map 与pair 与unordered_map 常⽤函数详解⼀、map 的概述map 是STL 的⼀个关联容器,它提供⼀对⼀(其中第⼀个可以称为关键字,每个关键字只能在map 中出现⼀次,第⼆个可能称为该关键字的值)的数据处理能⼒,由于这个特性,它完成有可能在我们处理⼀对⼀数据的时候,在编程上提供快速通道。

这⾥说下map 内部数据的组织,map 内部⾃建⼀颗红⿊树(⼀种⾮严格意义上的平衡⼆叉树),这颗树具有对数据的功能,所以在map 内部所有的数据都是有序的,后边我们会见识到有序的好处。

众所周知,在定义数组的时候⽐如(int array[10]) ,array[0]=25,array[1]=10,其实就是⼀个映射,将0—>25,1—>10,就是将0映射到25,将1映射到10,这种⼀⼀对应的关系就是映射,就数组来说,他的下标和其下标所对应的值就是⼀种映射关系,但是这⼀种关系⽐较死板,于是就有map ,这⼀种容器,。

⼆、map 的定义与初始化(插⼊)单独定义⼀个map :typename1是键值的数据类型typename2是值的数据类型如果是字符串映射到整型数组,键值必须使⽤string 类型,⽽不能使⽤char 数组。

这是因为char 作为数组,不能作为键值。

map 的键和值可以是STL 的容器,我们将set 映射到⼀个字符串三、map 的元素的访问map 中的容器值可以通过:下标和迭代器进⾏访问。

下标访问map 键值是唯⼀的通过迭代器访问map 的迭代器与其他STL 容器相同下⾯来看⼀个⽰例:⾃动排序下⾯举例说明:map 可以建⽴将任何基本类型(包括STL 容器)映射到任何基本数据类型(包括STL 容器)// 引⼊⼀个头⽂件#include <map>map<typename1,typename2> mp;map<set<int>,string> mp;#include <iostream>#include <map>#include <string>using namespace std;int main(){ map<char,int> mp;mp['c']=20;mp['c']=30; // 由于键值唯⼀,第⼀个他的值将会被覆盖cout<<mp['c']<<endl;return 0;}// 输出30map<typename1,typename2>::iterator it;// 由于⼀个it 对应两个值,我们使⽤ it->first 访问键 it->second 访问值PS :下⾯我以3种不同的⽅式进⾏插⼊不懂得可以参照这⼀篇⽂章:// 以类似数组的的表达⽅式来进⾏#include <iostream>#include <map>#include <string>using namespace std;int main(){map<char,int> mp;char key;int val;int t=5;while(t--){cin>>key>>val;mp[key]=val;}// 通过迭代器来访问for(map<char,int>::iterator it=mp.begin();it!=mp.end();it++){cout<<it->first<<" "<<it->second<<endl;}return 0;}a 5s 8z 6p 3t 7a 5p 3s 8t 7z 6其实细⼼的⼩伙伴已经发现,其输出结果是按照键值进⾏升序排序的。

STL用法详解

STL用法详解

April07详细解说STL string(转载)详细解说STL string详细解说STL string0前言:string的角色1string使用1.1充分使用string操作符1.2眼花缭乱的string find函数1.3string insert,replace,erase2string和C风格字符串3string和Charactor Traits4string建议5小结6附录7参考文章0前言:string的角色C++语言是个十分优秀的语言,但优秀并不表示完美。

还是有许多人不愿意使用C或者C++,为什么?原因众多,其中之一就是C/C++的文本处理功能太麻烦,用起来很不方便。

以前没有接触过其他语言时,每当别人这么说,我总是不屑一顾,认为他们根本就没有领会C++的精华,或者不太懂C++,现在我接触perl,php,和Shell脚本以后,开始理解了以前为什么有人说C++文本处理不方便了。

举例来说,如果文本格式是:用户名电话号码,文件名name.txtTom23245332Jenny22231231Heny22183942Tom23245332...现在我们需要对用户名排序,且只输出不同的姓名。

那么在shell编程中,可以这样用:awk'{print$1}'name.txt|sort|uniq简单吧?如果使用C/C++就麻烦了,他需要做以下工作:先打开文件,检测文件是否打开,如果失败,则退出。

声明一个足够大得二维字符数组或者一个字符指针数组读入一行到字符空间然后分析一行的结构,找到空格,存入字符数组中。

关闭文件写一个排序函数,或者使用写一个比较函数,使用qsort排序遍历数组,比较是否有相同的,如果有,则要删除,copy...输出信息你可以用C++或者C语言去实现这个流程。

如果一个人的主要工作就是处理这种类似的文本(例如做apache的日志统计和分析),你说他会喜欢C/C++么?当然,有了STL,这些处理会得到很大的简化。

stl语法详解

stl语法详解

stl语法详解STL(Standard Template Library)是C++标准库中的一个重要组成部分,它提供了一系列的通用模板类和函数,用于实现常用的数据结构和算法。

本文将详细解析STL的语法和使用方法。

一、容器(Containers)STL提供了多种容器,用于存储和管理数据。

常用的容器有vector、list、deque、set、map等。

1. vector(向量):是一种动态数组,可以自动调整大小。

通过push_back()函数可以向向量尾部插入元素,通过pop_back()函数可以删除尾部元素。

2. list(链表):是一种双向链表,可以在任意位置插入和删除元素。

通过push_back()和push_front()函数可以分别在尾部和头部插入元素。

3. deque(双端队列):是一种双向开口的队列,可以在队列的两端进行插入和删除操作。

4. set(集合):是一种自动排序的容器,不允许重复元素。

通过insert()函数可以插入元素,通过erase()函数可以删除元素。

5. map(映射):是一种键值对容器,每个元素都有一个唯一的键和对应的值。

通过insert()函数可以插入键值对,通过erase()函数可以删除键值对。

二、迭代器(Iterators)STL中的迭代器用于遍历容器中的元素,类似于指针的概念。

常用的迭代器有begin()和end()函数,分别用于返回容器的起始位置和末尾位置。

1. 前向迭代器(Forward Iterator):只能向前遍历容器中的元素,不支持随机访问。

2. 双向迭代器(Bidirectional Iterator):既可以向前遍历,也可以向后遍历容器中的元素。

3. 随机访问迭代器(Random Access Iterator):支持随机访问容器中的元素,可以通过[]运算符访问任意位置的元素。

三、算法(Algorithms)STL提供了丰富的算法,用于对容器中的元素进行各种操作。

[STL]vector中函数emplace_back的实现原理

[STL]vector中函数emplace_back的实现原理

[STL]vector中函数emplace_back的实现原理在vector中的emplace_back函数, 其效率⽐push_back⾼很多!/*例⼦中使⽤的Student类的声明*/class Student{private:int age;public:Student();explicit Student(int age);~Student();int getAge();};原理分析push_back函数vector<Student> team;team.push(Student(24));代码运⾏过程中, ⾸先是执⾏Student()创建了⼀个临时的Student对象, 然后再通过拷贝构造函数把这个临时对象的成员变量值复制到team中的空间⾥.⼆个原因造成效率慢:1. 创建临时Student对象时,需要申请内存空间, 申请内存空间⼀向是耗时很严重的操作;2. 拷贝构造函数的复制操作也是需要CPU时间的;emplace_back函数vector<Student> team;team.emplace_back(24);不说代码的执⾏效率, 这段代码实现的结果和上⾯是⼀样的. 都在team⾥添加了⼀个24岁的Student对象; 但在执⾏效率上, emplace_back函数很快;其原理就是emplace_back函数是直接在team中已有的空间上, 调⽤了Student类的构造函数, 节省了临时对象的内存空间申请以及拷贝构造函数的复制操作.emplace_back实现原理void* ptr = malloc(sizeof(Student));new (ptr)Student(100);cout << ((Student*)ptr)->getAge() << endl;第1⾏: 主要是分配⼀个Student对象所需的内存空间, 但在vector⾥, 这步不需要考虑, 内部会在实现;第2⾏: 这才是重点, 通过这样的语法, 就可以对已在的内存空间, 调⽤相应的Student类构造函数进⾏初始化;第3⾏: 输出验证结果.。

stl hash函数

stl hash函数

stl hash函数
STLhash函数是STL中用于实现哈希表的函数,它可以将任意类型的数据转化为哈希值,以便在哈希表中进行快速查找和插入操作。

STL提供了多种hash函数实现,包括std::hash、
std::hash_combine、std::hash_range等。

其中,std::hash是最常用的函数,它可以处理大部分的数据类型,包括整型、浮点型、指针、字符串等。

使用STL hash函数需要注意的事项:
1. 相同的输入值必须产生相同的哈希值,这是哈希表的基本要求。

2. 哈希值应该均匀地分布在哈希表中,以避免哈希冲突。

3. STL hash函数并不是绝对安全的,可能存在哈希碰撞,因此在实现哈希表时需要考虑这一点。

总的来说,STL hash函数是实现哈希表的重要组成部分,使用它可以简化哈希表的实现,并提高哈希表的查询和插入效率。

- 1 -。

  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 向量对象的方法示例:
相关文档
最新文档