stl

35、标准模板类(STL)(一),综述、容器及其操作

风流意气都作罢 提交于 2020-02-04 14:16:01
C++的 STL 是一个功能强大的库,它是建立在模板机制上,能够满足用户对存储管理不同类型数据的通用容器和施加在这些容器上的通用算法的巨大需求,并且具有完全的可移植性。因此在寻求程序的解决方案时,应该首先在 STL 中寻求恰当的容器和算法。 STL 是一个通用性极高的编程工具,这种通用性不仅表现在可以使用通用的容器存储和管理任意类型的数据,更重要的是可以对不同的容器施加统一通用的算法和操作。实现这种通用性的关键思想就是:通过引进一个间接层对象对不同结构的数据容器进行统一的访问操作,从而简化了对容器的操作,使得实现操作的算法和函数通用化。这种思想是 STL 的设计原则之一,也是软件设计中一个重要设计思想。 在 STL 中对容器访问的简化和独立就是通过循环子实现的,循环子可以无须依据某种特定容器的数据结构而完成对容器元素的访问,从而使得数据的存储结构与施加于数据的操作相互独立。标准模板库 STL 是由容器类模板,用于访问这些容器的循环子类模板和可以通过循环子在这些容器上实现的各种算法类模板以及函数类模板组成的。STL 为这种标准算法和函数(包括用户定义的函数)借助循环子在容器上实现的应用建立了统一的规则。 容器:可容纳各种数据类型的数据结构。 迭代器:可依次存取容器中元素的东西,连接容器和算法 算法:用来操作容器中的元素的函数模板。例如,STL用sort(

STL语句表跳转指令学习

人走茶凉 提交于 2020-02-04 12:11:26
打开语句表程序状态监控 发现 被跳过的指令用普通字体显示 被执行的指令用加粗的字体表示 录制成视频 如果除数是0 发生了溢出 用 JUO 跳转指令,跳转到 M001 例程已经录制成视频 上传到 百度网盘上 注意 注意观 察学习。 来源: https://www.cnblogs.com/bailongwei654321/p/12258845.html

STL笔记:函数配接器(Function adapters)

≡放荡痞女 提交于 2020-02-04 06:57:51
一:STL预定义函数配接器的使用 STL预定义的函数配接器 1. bind1st(op, value) 2. bind2st(op, value) 3. not1(param) 4. not2(param1,param2) 函数配接器可以将仿函数和另一个仿函数结合起来。 函数配接器本身也是仿函数。 二元函数配接器示例: find_if( coll.begin(), coll.end(), bind2nd(greater<int>(),42) ); 以上例句中,bind2nd将仿函数greater<int>()和第二个参数整型数42结合起来,查找条件就变成了“大于42”。 其中greater<int>为STL预定义的仿函数,接收两个参数比较,第一个参数为coll中元素,第二个参数42作为greater<int>的内部参数保存,上面的语句相当于以下伪代码的逻辑(注意只是相等逻辑,非STL实现): greater<int> functorGreater; //在find_if语句内部,仿函数会创建一个实例对象 for(std::vector<int>::const_iterator It = coll.begin(); It != coll.end(); ++It ) { if( functorGreater(*It,42) ) //调用仿函数greater<int>内部的重载操作符"(

STL源码剖析(适配器)

有些话、适合烂在心里 提交于 2020-02-04 06:07:42
STL中由三类适配器,它们分别是: 1.容器适配器(stack、queue) 2.迭代器适配器(insert_iterator、reverse_iterator、iostream_iterator) 3.函数适配器(bind1st等等) 容器适配器 关于容器适配器我们已经在前面的http://www.cnblogs.com/runnyu/p/6003821.html讲过了。 迭代器适配器 1.insert iterator 当我们这样使用copy算法的时候: 1 vector<int> ins = { 1, 3, 5, 7}; 2 vector<int> coll; // coll为空 3 copy(ins.begin(), ins.end(), coll.begin()); View Code 毫无疑问会出现错误,因为copy算法中调用的是iterator的operator*跟operator=,用的是赋值操作,而要进行赋值的iterator并不合法。 insert iterator可以解决这个问题,其实它的实现很简单。 下面是back_inserter的用法跟实现,它的实现主要是重载了operator*跟operator=方法,然后提供了一个接口函数。 1 // 以容器为参数 将元素copy到coll的末尾 2 copy(ins.begin(), ins.end(), back

<STL源码剖析>阅读笔记之 仿函数和适配器

跟風遠走 提交于 2020-02-04 05:48:07
仿函数(函数对象)和适配器可以说是STL中默默无闻的贡献者,它们没有容器、算法和迭代器那么有名 但是其贡献却很大。这里总结的主要是书中第7、8章的内容。 一 仿函数 仿函数又称函数对象,从名字上可以得出,它本质上是 一种具有函数特质的对象 , 也即可以像使用函 数 一样使用该对象。怎么样做?重载operator()运算符即可,有了这个运算符,我们就可以在仿函数对象后 面加上一对小括号,以此调用仿函数所定义的operator()。STL仿函数可以分为一元和二元,或者算术运 算、关系运算和逻辑运算。 为什么要有仿函数?在算法的设计过程中,我们会发现其本质往往是不变的(例如排序算法的思想),变 化的除了数据之外还有操作(例如排序中不一定是比较大小,也可以是两两之间满足某种关系),仿函数就 是为了这种情况产生的,它替代原来需要函数指针的地方,把这种操作或者策略传给算法,使得算法抽象性 更高,也就更通用。 为什么不用函数指针?很简单的解释是抽象性不够,更进一步说是它无法配接,也就是可以将操 作配接在 一起变换为更复杂的操作(例如compose和bind1st等等方法),仿函数则可以轻松实现这些配接, 使得其功 能异常强大。 仿函数在实现上是一个结构体,并且如上所述重载了operator()运算符,所有的仿函数如果是一元的都继 承自unary_function,二元则继承自binary

STL适配器的初步理解

為{幸葍}努か 提交于 2020-02-04 05:39:25
c++中的适配器有三种:容器适配器,迭代器适配器,函数适配器。下面一一介绍: 1.容器适配器: 因为这些容器都是基于其他标准容器实现的所以叫做容器的适配器,具体的有stack,queue,priority_queue,默认的情况下,stack和queue基于deque而实现的,,priority_queue在vector上实现的,可以根据第二个实参指定容器的类型,但一定要符合标准,queue要求要有push_front操作因此不能建立在vector上面,priority_front要求有随机访问的功能,因此建立在vector上面。优先级队列默认情况下是大顶堆,也就是大者优先级高,后面可以自定义优先级比较规则 2.迭代器适配器: 包括三种reverse(逆向)适配器,insert(安插型)迭代器,stream(串流)适配器。reverse适配器:如rbegin(),rend()等。 insert迭代器:是一种迭代器适配器,带有一个容器参数,并生成一个迭代器,提供了三种插入器back_inserter(容器),front_inserter(容器),inserter(容器,位置)。 stream适配器:如ostream_iterator,istream_iterator。 3.函数适配器 ,用于扩展一元和二元函数对象,如functor 函数对像等等。用于容器与算法之前的操作时使用。 来源

STL(1) —— map

我与影子孤独终老i 提交于 2020-02-04 03:55:12
文章目录 一、插入 二、删除 三、查询 四、排序 这篇文章是在做一道ccf题的时候起意写的,也是为了方便自己以后回顾叭。包含一些map的常用简单操作。 一、插入 在使用map时,插入有3种方法。 用insert函数插入pair。 用insert函数插入value_type数据。 用array数组方式插入。 map<int,string> student; //1 student.insert(pair<int,string>(000,"student0"); //2 student.insert(map<int,string>::value_type(001,"student1"); //3 student[12] = "student12"; 这三种方法第一种和第二种效果是一样的,不能违背map的唯一性,也就是如果原本map容器种存在该key值,那么插入失败。但是第三种可以插入覆盖原值。 二、删除 map容器种和删除相关的函数有erase、clear、empty等。 empty 用来判断map容器是否为空。函数返回值为bool型,返回true说明是空map,反之则表示map中有元素。 clear 用来清空map容器。 erase erase函数用来删除指定元素,map中写了三种erase函数方便我们使用。 1、迭代器删除 2、用关键字删除 3、范围删除 //迭代器刪除 iter

【STL 笔记、一】容器:vector

感情迁移 提交于 2020-02-04 01:52:09
文章目录 1 STL 简介 2 容器 vector 2.1 构造 2.2 成员函数 2.2.1 assgin 2.2.2 数据大小操作 2.2.1.empty 2.2.2 容量 2.2.3 删除与插入操作 2.2.4 swap 3 vector总结 1 STL 简介 STL是Standard Template Library的简称,中文名标准模板库 STL可分为 容器(containers)、 迭代器(iterators)、 空间配置器(allocator)、 配接器(adapters)、 算法(algorithms)、 仿函数(functors)六个部分。 选自百度词条 STL百度词条 C++标准中,STL组件被组织命名为以下13个头文件 < algorithm> < deque> < functional> < iterator> < vector> < list> < map> < memory.h> < numeric> < queue> < set> < stack> < utility> 2 容器 vector 向量(vector) 连续存储的元素< vector>; vector是一个能够存放任意类型的动态数组,能够增加和压缩数据。 为了更好理解,不用基础类型,自行定义一个MyInt结构体 struct MyInt { string name ; //用作标识符

Coffee Break(贪心+STL)

痴心易碎 提交于 2020-02-03 12:16:14
Recently Monocarp got a job. His working day lasts exactly mm minutes. During work, Monocarp wants to drink coffee at certain moments: there are nn minutes a1,a2,…,ana1,a2,…,an , when he is able and willing to take a coffee break (for the sake of simplicity let's consider that each coffee break lasts exactly one minute). However, Monocarp's boss doesn't like when Monocarp takes his coffee breaks too often. So for the given coffee break that is going to be on minute aiai , Monocarp must choose the day in which he will drink coffee during the said minute, so that every day at least dd minutes

memmem() STL way?

浪尽此生 提交于 2020-02-03 09:28:27
问题 Is there an STL algorithm which can be used to search a sequence of bytes inside a buffer like memmem() does? 回答1: I don't know if this is good code, but the following works, using std::search: #include <cstdio> #include <string.h> #include <algorithm> int main(int argc, char **argv) { char *a = argv[0]; char *a_end = a + strlen(a); char *match = "out"; char *match_end = match+strlen(match); // If match contained nulls, you would have to know its length. char *res = std::search(a, a_end,