STL常用总结

合集下载

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 string常用函数

stl string常用函数

STL String常用函数STL String是C++中的一个非常重要的字符串类,它提供了许多函数来处理字符串。

在这篇文章中,我们将介绍STL String的常用函数,包括字符串的创建、修改、查找和比较等。

一、创建字符串1.构造函数STL String有多种构造函数,可以用来创建字符串。

其中,最常用的构造函数是默认构造函数,它创建一个空字符串:```c++string str; //创建一个空字符串```还可以使用其他构造函数来创建字符串,如:```c++string str1("Hello"); //使用字符串字面值创建字符串string str2(str1); //使用另一个字符串创建字符串string str3(5, 'A'); //创建一个包含5个'A'字符的字符串```2.赋值函数STL String还提供了多种赋值函数,可以用来将一个字符串赋值给另一个字符串。

其中,最常用的赋值函数是赋值运算符:```c++string str1 = "Hello";string str2 = str1;```还可以使用其他赋值函数,如:```c++string str3;str3.assign("Hello"); //将字符串字面值赋值给字符串str3.assign(str1); //将另一个字符串赋值给字符串str3.assign(5, 'A'); //将5个'A'字符赋值给字符串```二、修改字符串1.插入函数STL String提供了多种插入函数,可以用来在字符串中插入字符或子字符串。

其中,最常用的插入函数是insert()函数:```c++string str = "Hello";str.insert(1, "i"); //在第1个字符位置插入字符"i"```还可以使用其他插入函数,如:```c++string str1 = "Hello";str1.insert(1, "i", 1); //在第1个字符位置插入字符"i"的第1个字符str1.insert(1, 3, 'A'); //在第1个字符位置插入3个'A'字符str1.insert(str1.begin() + 1, 'i'); //在第1个字符位置插入字符"i"str1.insert(str1.begin() + 1, str); //在第1个字符位置插入另一个字符串str1.insert(str1.begin() + 1, str.begin(), str.end());//在第1个字符位置插入另一个字符串的一部分```2.删除函数STL String提供了多种删除函数,可以用来删除字符串中的字符或子字符串。

stl容器经典算法总结.

stl容器经典算法总结.

经典STL算法说明includes、set_difference、set_intersection、set_symmetric_difference、set_union, pre_permutation, next_permutation,min_element,max_element,sort最后自定义一个C++通过归并的方式求交集和并集includes说明:测试有序序列中是否包含另一个序列的全部元素template<class inputIterator1, class inputIterator2>bool includes(inputIterator1 first1, inputIterator1 last1,inputIterator2 first2, inputIterator2 last2;template<class inputIterator1 , class inputIterator2, class Comp>bool includes(inputIterator1 first1, inputIterator1 last1,inputIterator2 first2, inputIterator2 last2,Comp cmp;注意:两个序列必须都是排序的且相同的排序,Comp必须和两个序列用相同的排序函数对象。

建议:鉴于以上特点,用std::set 作为容器比较好set_differrence说明:◆set_difference(算法计算两个集合[start1, end1和[start2, end2的差集, 并将差集存放到result.两个集合以序列的形式给出, 且必须先按升序排好位置◆ set_difference(是一个指向result序列末尾的迭代器◆如果严格弱排序的比较函数对象cmp未指定, set_difference(将使用<操作符比较元素◆包含在第一个有序集合中,但不包含第二个有序集合中的元素,这些不同的元素复制到最后一个参数中,最后一个参数是一个保存这些元素的容器的首迭代器,这个容器必须预先分配足够的空间来容纳元素。

STL的入门知识

STL的入门知识

Adaptor(适配器)模式

定义:将一个类的界面转换为另一个类的界 面,使原本因界面不相容而不能合作的 classes,可以一起运作。
Adaptor模式

在STL中,改变iterator界面的叫做iterator adaptor 改变container界面的叫做container adaptor, 改变function object界面的叫做function adaptor
关联式容器

Maps/Multimaps
用map/multimap前,必 须包含头文件<map>
便捷函 数,返 回一个 pair对象
容器的共通能力
所有容器提供的都是value语意,而非 reference语意。容器执行插入元素的操 作时,内部实施拷贝动作。所以STL容 器内存储的元素必须能够被拷贝(必须 提供拷贝构造函数)。 每个容器都提供可返回迭代器的函数, 运用返回的迭代器就可以访问元素。 通常STL不会丢出异常。要求使用运行 者对确保传入正确的参数。

迭代器的基本操作
用法和指针一样, 其实指针就是一 种迭代器
运算符 重载
迭代器(Iterator)简述

迭代器示例
关联式容器

Sets/Multisets
– 内部的元素依据其值自动排序 – Set(集合容器)内的相同数值的元素只能 出现一次,Multisets(多重集合容器)内 可包含多个数值相同的元素。


Container Adaptor


STL提供的另两种容器queue、stack,其实 都只不过是一种adaptor,它们简单地修饰 deque的界面而成为另外的容器类型 STL的源码

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学习总结大全

STL就是S‎t andar‎d Templa‎t e Librar‎y,标准模板库。

这可能是一个‎历史上最令人‎兴奋的工具的‎最无聊的术语‎。

从根本上说,STL是一些‎“容器”的集合,这些“容器”有list, vector‎,set,map等,STL也是算‎法和其它一些‎组件的集合。

这里的“容器”和算法的集合‎指的是世界上‎很多聪明人很‎多年的杰作。

是C++标准库的一个‎重要组成部分‎,它由Step‎a nov and Lee等人最‎先开发,它是与C++几乎同时开始‎开发的;一开始STL‎选择了Ada‎作为实现语言‎,但Ada有点‎不争气,最后他们选择‎了C++,C++中已经有了模‎板。

STL又被添‎加进了C++库。

1996年,惠普公司又免‎费公开了ST‎L,为STL的推‎广做了很大的‎贡献。

STL提供了‎类型安全、高效而易用特‎性的STL无‎疑是最值得C‎++程序员骄傲的‎部分。

每一个C++程序员都应该‎好好学习ST‎L。

大体上包括c‎o ntain‎e r(容器)、algori‎t hm(算法)和itera‎t or(迭代器),容器和算法通‎过迭代器可以‎进行无缝连接‎。

一、基础知识1、泛型技术泛型技术的实‎现方法有多种‎,比如模板,多态等。

模板是编译时‎决定,多态是运行时‎决定,其他的比如R‎T TI 也是运‎行时确定。

多态是依靠虚‎表在运行时查‎表实现的。

比如一个类拥‎有虚方法,那么这个类的‎实例的内存起‎始地址就是虚‎表地址,可以把内存起‎始地址强制转‎换成int*,取得虚表,然后(int*)*(int*)取得虚表里的‎第一个函数的‎内存地址,然后强制转换‎成函数类型,即可调用来验‎证虚表机制。

泛型编程(generi‎c progra‎m ming,以下直接以G‎P称呼)是一种全新的‎程序设计思想‎,和OO,OB,PO这些为人‎所熟知的程序‎设计想法不同‎的是GP抽象‎度更高,基于GP设计‎的组件之间偶‎合度底,没有继承关系‎,所以其组件间‎的互交性和扩‎展性都非常高‎。

stl常用算法

stl常用算法

stl常用算法
STL(StandardTemplateLibrary)是C++的一种标准库,其中包含了许多常用的算法。

以下是STL中常用的算法:
1. sort:排序算法,可对数组或容器进行排序。

2. find:在容器中查找某个元素,返回该元素的迭代器。

3. count:统计容器中某个元素的个数。

4. max/min:返回容器中最大/最小元素的迭代器。

5. accumulate:对容器中的元素进行累加操作。

6. reverse:将容器中的元素反转。

7. unique:去重,将容器中重复的元素去除。

8. transform:对容器中的元素进行转换操作。

9. copy:将一个容器中的元素复制到另一个容器中。

10. fill:将容器中的元素全部赋值为指定值。

以上是STL中常用的算法,它们提供了一些方便的方法来操作容器中的元素。

在实际开发中,我们可以根据需要选择合适的算法来解决问题。

- 1 -。

STL基础学习(STL中的容器解析代码展示例题分析,帮助你学STL)

STL基础学习(STL中的容器解析代码展示例题分析,帮助你学STL)

STL就是Standard Template Library(C++标准模板库),下面是关于STL中的各种内容STL中的几个基本概念:1.容器:可容纳各种数据类型的数据结构。

可以用于存放各种类型的数据(基本类型的变量,对象等)的数据结构。

容器分为三大类:(1) 顺序容器vector:后部插入/删除,直接访问deque:前/后部插入/删除,直接访问list:双向链表,任意位置插入/删除1) vector 头文件<vector>实际上就是个动态数组。

随机存取任何元素都能在常数时间完成。

在尾端增删元素具有较佳的性能。

2) deque 头文件<deque>也是个动态数组,随机存取任何元素都能在常数时间完成(但性能次于vector)。

在两端增删元素具有较佳的性能。

3) list 头文件<list>双向链表,在任何位置增删元素都能在常数时间完成。

不支持随机存取。

上述三种容器称为顺序容器,是因为元素的插入位置同元素的值无关。

(2)关联容器set:快速查找,无重复元素multiset :快速查找,可有重复元素map:一对一映射,无重复元素,基于关键字查找multimap :一对一映射,可有重复元素,基于关键字查找,前2者合称为第一类容器关联式容器内的元素是排序的,插入任何元素,都按相应的排序准则来确定其位置。

关联式容器的特点是在查找时具有非常好的性能。

1) set/multiset: 头文件<set>set 即集合。

set中不允许相同元素,multiset中允许存在相同的元素。

2) map/multimap: 头文件<map>map与set的不同在于map中存放的是成对的key/value。

并根据key对元素进行排序,可快速地根据key来检索元素map同multimap的不同在于是否允许多个元素有相同的key值。

上述4种容器通常以平衡二叉树方式实现,插入和检索的时间都是O(logN)(3)容器适配器stack:LIFO queue:FIFO priority_queue:优先级高的元素先出对象被插入容器中时,被插入的是对象的一个复制品。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

STL常用总结Last Update (July. 2014) by WINGACM/ICPC 竞赛之STL 简介一、关于STLSTL(Standard Template Library,标准模板库)是C++语言标准中的重要组成部分。

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) );}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 / mapmemory / 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);...return 0;}STL 是C++语言机制运用的一个典范,通过学习STL 可以更深刻地理解C++ 语言的思想和方法。

在本系列的文章中不打算对STL 做深入的剖析,而只是想介绍一些STL 的基本应用。

有兴趣的同学,建议可以在有了一些STL 的使用经验后,认真阅读一下《C++ STL》这本书(电力出版社有该书的中文版)。

ACM/ICPC 竞赛之STL--pairSTL 的<utility>头文件中描述了一个看上去非常简单的模板类pair,用来表示一个二元组或元素对,并提供了按照字典序对元素对进行大小比较的比较运算符模板函数。

例如,想要定义一个对象表示一个平面坐标点,则可以:pair<double, double> p1;cin >> p1.first >> p1.second;pair 模板类需要两个参数:首元素的数据类型和尾元素的数据类型。

pair 模板类对象有两个成员:first 和second,分别表示首元素和尾元素。

在<utility>中已经定义了pair 上的六个比较运算符:<、>、<=、>=、==、!=,其规则是先比较first,first 相等时再比较second,这符合大多数应用的逻辑。

当然,也可以通过重载这几个运算符来重新指定自己的比较逻辑。

除了直接定义一个pair 对象外,如果需要即时生成一个pair 对象,也可以调用在<utility>中定义的一个模板函数:make_pair。

make_pair 需要两个参数,分别为元素对的首元素和尾元素。

在题1067--Ugly Numbers 中,就可以用pair 来表示推演树上的结点,用first 表示结点的值,用second 表示结点是由父结点乘以哪一个因子得到的。

#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) );}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 向量对象的方法示例: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, val)向迭代器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 填满扩展出的空间。

相关文档
最新文档