###STL学习--适配器
点击查看Evernote原文。
#@author: gr
#@date: 2014-08-24
#@email: forgerui@gmail.com
STL中的适配器。
###stl学习
|--迭代器
|--类属算法
|--容器
|--vector
|--deque
|--list
|--set
|--map
|--函数对象
|--适配器
|--分配器
一、Contents
适配器概述:
适配器作用是改变其他组件的接口。它们是以模板类的形式定义的,并且以另一种组件的类型作为参数。STL提供了3种适配器组件,包括容器适配器
、迭代适配器
和函数适配器
。
容器适配器
1. 栈容器适配器(stack)
栈适配器只有有限的接口,包括push
,pop
,top
,empty
,size
。可以用vector
,deque
,list
实现。其中pop
函数没有返回值,要取值,先用top
函数获取。
stack是类型为T的栈,默认情况下以deque
实现。
stack< T, vector >是类型为T的栈,以vector
实现。
stack< T, list >是类型为T的栈,以list
实现。
stack< T, deque >是类型为T的栈,以deque
实现。
stack<int> s;
int thedata[] = {1, 2, 3, 4};
for (int i = 0; i < 4; i++){
s.push(thedata[i]);
}
s.pop();
cout<<s.top();
cout<<s.size();
while (!s.empty())
s.pop();
2. 队列适配器(queue)
queue
提供的操作包括:empty
,size
,front
,back
,push
,pop
。同样,pop
没有返回值。队列适配器可以使用list
和deque
实现。没有vector
,因为它不支持pop_front
,实际上实现pop_front
很容易,v.erase(v.begin());
便可以,但是这个操作需要将后面所有值都前移,效率太低,没有vector
没有提供这种接口。
queue类型为T的队列,默认情况下以deque
实现。
queue<T, list >类型为T的队列,以list
实现。
queue<T, deque >类型为T的队列,以deque
实现。
int thedata[] = {1, 2, 3, 4};
//使用list实现
queue<int, list<int> > q;
for (int i = 0; i < 4; i++){
q.push(the_data[i]);
}
q.pop();
3. 优先级队列容器适配器
优先级队列根据元素之间某种特定的排序准则,只有序列中最大的元素可以第一个被检索到。可以用具有随机访问迭代器的容器实现,即可以使用vector
和list
实现。
priority_queue将int
类型保存到vector
中,并使用默认的比较对象less<int>
。
priority_queue<int, list, greater >将int
类型保存到list
中,并使用greater<int>
比较对象。
priority_queue<int, vector, greater >将int
类型保存到vecotr
中,并使用greater<int>
比较对象。
int thedata[] = {1, 2, 3, 4};
//使用默认
priority_queue<int> pq;
for (int i = 0; i < 4; i++){
pq.push(the_data[i]);
}
pq.pop();
迭代器适配器
1. 反向迭代器适配器
迭代器适配器是用来改变迭代器组件的STL组件。STL中只预定了这一种迭代器适配器。容器都直接提供了反向迭代器,reverse_iterator
和const_inverse_iterator
,也可以使用rbegin
和rend
。
使用accumulate
进行浮点数相加时,如果是从大到小排序,则一般相加是从大到小相加,然而我们知道,先将小数进行相加,可以获得更高的准确率,一个例子中,从左向右结果为1,而从右向左(小数先加)的结果为1.000000119,得到的结果更加精确。
float sum1 = accumulate(v.begin(), v.end(), (float)0.0);
float sum2 = accumulate(v.rbegin(), v.rend(), (float)0.0);
//使用反向迭代器,从后往前遍历
vector<char>::reverse_iterator r = find(v.rbegin(), v.rend(), 't');
//从后往前拷贝
copy(r, v.rend(), out);
函数适配器
函数适配器可以帮助我们创建各类更加广泛的函数对象。STL提供了3种类型函数适配器:绑定器(binder),取反器(negator)和函数指针适配器。
1. 绑定器
可以把二元函数的一个参数绑定到一个特定的值,将二元函数转化为一元函数。
//可以使用bind1st去绑定第一个参数,下面程序的功能是查找第一个>200元素位置
int* where = find_if(&arr[0], &arr[100], bind2nd(greater<int>(), 200));
//greater operator()定义
bool operator() (int x, int y) const { return x > y;}
//使用bind2nd后可以理解为
bool operator() (intx) const { return x > 200;}
2. 取反器
取反器是一种用来对判决函数对象取反的函数适配器。STL提供了两种类型的取反适配器,not1
和not2
。
not1
是对一元判决函数取反,not2
是对二元判决函数取反。
//查找第一个不大于200(即<=200)的元素
int* where = find_if(&arr[0], &arr[100], not1(bind2nd(greater<int>(), 200)));
//上面也可以直接用函数对象less_equal实现,更明确
int* where = find_if(&arr[0], &arr[100], bind2nd(less_equal<int>(), 200));
3. 函数指针适配器
提供函数指针适配器的目的是为了让指向一元二元函数的指针能够与STL所提供的其它函数适配器一起工作。
如果在一个程序中需要使用两种不同的集合,但它们只有比较函数不同,如下定义:
set<string, less<string> > set11;
set<string, greater<string> > set2;
尽管两个实体的大部分实现代码都相同,编译器还是会重复生成两个实体的大部分或全部实现代码,为了避免这种代码重复,可以只声明set的一个实体,并使用函数指针适配器作为其比较函数的类型,用来保持集合中元素的有序性。
set<string, pointer_to_binary_function<const string&, const string&, bool> >
具体实现需要合用ptr_fun:
bool less1(const string& x, const string& y){
return x < y;
}
bool greater1(const string& x, const string& y){
return x > y;
}
int main(){
typedef set<string, pointer_to_binary_function<const string&, const string&, bool> > set_type1
set_type1 set1(ptr_fun(less1));
//可以使用set1了
set1.insert("the");
set_type1 set2(ptr_fun(greater1));
//可以使用set2了
set2.inser("the");
}
这种操作利用函数指针需要直接寻址,比使用不同的set实体的程序慢一点,但这种方式可以大大降低可执行文件大小。
二、Miscellany
@author gr
@mail forgerui@gmail.com
###STL学习--适配器的更多相关文章
- 侯捷STL学习(11)--算仿+仿函数+适配器
layout: post title: 侯捷STL学习(十一) date: 2017-07-24 tag: 侯捷STL --- 第三讲 标准库内核分析-算法 标准库算法形式 iterator分类 不同 ...
- ###STL学习--vector
点击查看Evernote原文. #@author: gr #@date: 2014-08-11 #@email: forgerui@gmail.com vector的相关问题.<stl学习> ...
- ###STL学习--关联容器
点击查看Evernote原文. #@author: gr #@date: 2014-08-23 #@email: forgerui@gmail.com STL中的关联容器. ###stl学习 |--迭 ...
- ###STL学习--迭代器
点击查看Evernote原文. #@author: gr #@date: 2014-08-23 #@email: forgerui@gmail.com STL中的迭代器. ###stl学习 |--迭代 ...
- ###STL学习--函数对象
点击查看Evernote原文. #@author: gr #@date: 2014-08-13 #@email: forgerui@gmail.com 在stl中,函数对象被大量地使用,用以提高代码的 ...
- 标准模板库(STL)学习探究之stack
标准模板库(STL)学习探究之stack queue priority_queue list map/multimap dequeue string
- 标准模板库(STL)学习探究之vector容器
标准模板库(STL)学习探究之vector容器 C++ Vectors vector是C++标准模板库中的部分内容,它是一个多功能的,能够操作多种数据结构和算法的模板类和函数库.vector之所以被 ...
- STL学习:STL库vector、string、set、map用法
本文仅介绍了如何使用它们常用的方法. vector 1.可随机访问,可在尾部插入元素:2.内存自动管理:3.头文件#include <vector> 1.创建vector对象 一维: (1 ...
- Effective STL 学习笔记 39 ~ 41
Effective STL 学习笔记 39 ~ 41 */--> div.org-src-container { font-size: 85%; font-family: monospace; ...
随机推荐
- VS2010 error C2664: “CWnd::MessageBoxW”: 不能将参数 1 从“const char [3]”转换为“LPCTSTR”
VS2010 (VC2010)建立工程时默认的字符集是Unicode,所以在代码中使用MessageBox时需要输入Unicode,用TEXT()这个宏输入参数,否则会报错: 代码:Message ...
- SQL中EXISTS的用法和效率
比如在Northwind数据库中有一个查询为SELECT c.CustomerId,CompanyName FROM Customers cWHERE EXISTS(SELECT OrderID FR ...
- hdu 2212
1.简单的思维问题 各个位上阶乘的和 要和这个数相匹配 这样才能得到正确的解.各个位上阶乘的和 是最大是9*9!这样来求解.999999999 9个9 最大的各个位上的阶乘的和为3265920=9 ...
- 如何检查机器是否因为装了Windows更新而需要重新启动
博客搬到了fresky.github.io - Dawei XU,请各位看官挪步.最新的一篇是:如何检查机器是否因为装了Windows更新而需要重新启动.
- 【STL源码学习】STL算法学习之三
第一章:前言 数量不多,用到的时候会很爽. 第二章:明细 STL算法中的又一个分类:分割:将已有元素按照既定规则分割成两部分. is_partitioned 函数原型: template <c ...
- shuffle 过程
Shuffle描述着数据从map task输出到reduce task输入的这段过程(Shuffle的正常意思是洗牌或弄乱). 以下是官网的流程图: 从最基本的要求来说,我们对Shuffle过程的期望 ...
- jboss7的服务器开启和关闭命令
国内私募机构九鼎控股打造APP,来就送 20元现金领取地址:http://jdb.jiudingcapital.com/phone.html内部邀请码:C8E245J (不写邀请码,没有现金送)国内私 ...
- 眼下最好的JSP分页技术
2005-08-24 来源:CSDN 作者:wanchao2001 前言 在使用数据库的过程中,不可避免的须要使用到分页的功能,但是JDBC的规范对此却没有非常好的解决.对于这个需求非 ...
- [React Native] Create a component using ScrollView
To show a list of unchanging data in React Native you can use the scroll view component. In this les ...
- Gradle的安装与配置
Gradle的下载地址:http://gradle.org/gradle-download/ Tips:要先安装JDK并配置其环境变量. 下载完成后将里面的文件解压出来,如下图所示: 添加一个名称为G ...