GeekBand C++ STL 第二周

1.容器

1.1 stack

stack是一种先进后出的数据结构,stack 模板类的定义在头文件中。

stack 模板类需要两个模板参数,一个是元素类型,一个容器类型,但只有元素类型是必要

的,在不指定容器类型时,默认的容器类型为deque。

定义stack 对象的示例代码如下:

stack s1;

stack s2;

stack 的基本操作有:

入栈,如例:s.push(x);

出栈,如例:s.pop();注意,出栈操作只是删除栈顶元素,并不返回该元素。

访问栈顶,如例:s.top()

判断栈空,如例:s.empty(),当栈空时,返回true。

访问栈中的元素个数,如例:s.size()。

补充:stack的三种含义

含义一:数据结构

stack的第一种含义是一组数据的存放方式,特点为LIFO,即后进先出(Last in, first out)。

既上述stl中所描述的stack

含义二:代码运行方式

stack的第二种含义是"调用栈"(call stack),表示函数或子例程像堆积木一样存放,以实现层层调用。

含义三:内存区域

stack的第三种含义是存放数据的一种内存区域。程序运行的时候,需要内存空间存放数据。一般来说,系统会划分出两种不同的内存空间:一种叫做stack(栈),另一种叫做heap(堆)。

它们的主要区别是:stack是有结构的,每个区块按照一定次序存放,可以明确知道每个区块的大小;heap是没有结构的,数据可以任意存放。因此,stack的寻址速度要快于heap。

1.2 queue

queue 队列也是一个线性存储表,与后进先出的堆栈不同,元素数据的插入在表的一端进行,在另一端删除,从而构成了一个先进先出(First In First Out) 表。插入一端称为队尾,删除一端称为队首。

由于C++ STL 的队列泛化,默认使用双端队列 deque 来实现,因此,queue 也可看成一个容器的适配器,将 deque 容器转换为 queue 容器。当然,也可以利用其它合适的序列容器作为底层实现 queue 容器。

queue队列容器的C++标准头文件为 queue ,需要用宏语句 "#include " 包含进来才可应用 queue 容器进行开发。

1.3 map

map是一种关联容器,存储的对象是一组key/value

不允许有重复的key

map存储的对象必须是可排序性的

template,class_Alloc = allocator>>classmap{...}

默认采用less定义排序行为,如果map中存储的是自己定义的类,则需要重载operator <

或者可以通过仿函数自定义排序行为

1.3 set

set是一种关联容器,存储的对象既是key又是value

这是 set与map的最大区别

MAP的节点是一对数据.

SET的节点是一个数据.

Map使用关键值Key来唯一标识每一个成员 ,map可以重复。

set是集合 ,不能重复

在作业中遇到的问题:set的iterator类型自动就是const的引用类型,因此当set保存的是类类型时,对iterator解引用无法调用类的非const成员。

解决办法:

1.set中不存储对象本身,改为存储对象指针

2.利用const_cast 进行转型

2.仿函数

仿函数又称函数对象,从名字上可以得出,它本质上是**一种具有函数特质的对象**, 也即可以像使用函

数一样使用该对象。怎么样做?重载operator()运算符即可,有了这个运算符,我们就可以在仿函数对象后

面加上一对小括号,以此调用仿函数所定义的operator()。STL仿函数可以分为一元和二元,或者算术运

算、关系运算和逻辑运算。

为什么要有仿函数?在算法的设计过程中,我们会发现其本质往往是不变的(例如排序算法的思想),变

化的除了数据之外还有操作(例如排序中不一定是比较大小,也可以是两两之间满足某种关系),仿函数就

是为了这种情况产生的,它替代原来需要函数指针的地方,把这种操作或者策略传给算法,使得算法抽象性

更高,也就更通用。

为什么不用函数指针?很简单的解释是抽象性不够,更进一步说是它无法配接,也就是可以将操作配接在

一起变换为更复杂的操作(例如compose和bind1st等等方法),仿函数则可以轻松实现这些配接,使得其功

能异常强大。

仿函数在实现上是一个结构体,并且如上所述重载了operator()运算符,所有的仿函数如果是一元的都继

承自unary_function,二元则继承自binary_function,因为继承自这两个函数的仿函数均定义了相应型别供

配接时使用,也就具有了配接能力。


2.仿函数适配器

由于在for_each的定义中只接受f(obj)这种类型的调用,mem_fun和mem_fun_ref的存在可以让obj的成员函数f可以以f(obj)这种形式被调用

for_each(set1.begin(), set1.end(), mem_fun(&Programmer::print));

需要注意的是如果set中存储的是对象本身,则需要使用mem_fun_ref,如果存储的是对象指针则使用mem_fun

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,482评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,377评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,762评论 0 342
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,273评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,289评论 5 373
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,046评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,351评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,988评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,476评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,948评论 2 324
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,064评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,712评论 4 323
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,261评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,264评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,486评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,511评论 2 354
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,802评论 2 345

推荐阅读更多精彩内容