C++进阶 STL(3) 第三天 函数对象适配器、常用遍历算法、常用排序算法、常用算数生成算法、常用集合算法、 distance_逆序遍历_修改容器元素
01昨天课程回顾
02函数对象适配器
函数适配器是用来让一个函数对象表现出另外一种类型的函数对象的特征。因为,许多情况下,我们所持有的函数对象或普通函数的参数个数或是返回值类型并不是我们想要的,这时候就需要函数适配器来为我们的函数进行适配。
使用方法:
第一步 让函数对象
1 绑定器适配器
作用: 可以动态改变函数对象的一个参数,不用生成多个函数对象
2. 取反适配器
作用:改变函数谓词(返回值为bool的函数对象)的返回状态//true改为false false改为true
3. 普通函数适配器
作用:将普通函数当作函数对象处理,使之可以传入参数
4. 成员函数适配器
作用:
03常用遍历算法
for_each(iterator beg,iterator end,_callback)
transform:
transform 第一种情况: 一个容器种的元素经过运算 把结果放进目标容器中(b2)
第二种情况:两个容器进行运算,把结果放到第三个容器中。
4 常用 查找算法
- find算法:
查找为相同值的第一个元素
void test01() {
vector<int> v;
v.push_back(8);
v.push_back(2);
v.push_back(5);
v.push_back(6);
vector<int>::iterator pos = find(v.begin(), v.end(), 5);
if (pos == v.end()) {
cout << "没有找到!" << endl;
}
else {
cout << "找到了:" << *pos << endl;
}
}
2.find_if算法:
查找是否有这个值
class mycompare03 {
public:
bool operator()(int v) {
return v > 2;
}
};
void test03() {
vector <int> v;
v.push_back(8);
v.push_back(2);
v.push_back(5);
v.push_back(6);
/*
*/
vector<int>::iterator pos = find_if(v.begin(), v.end(), mycompare03());
if (pos == v.end()) {
cout << "没有找到!" << endl;
}
else {
cout << "找到了:" << *pos << endl;
}
}
查找对象:
需要重写== 方法:
class student {
public:
student(int id, int age) :id(id), age(age) {};
int id;
int age;
bool operator==(const student& s) {
if (this->id == s.id && this->age == s.age) {
return true;
}
else
{
return false;
}
//return this->id == s.id && this->age == s.age;
}
};
void test02() {
vector<student> v;
student s1(1, 2), s2(3, 4), s3(5, 6);
v.push_back(s1);
v.push_back(s2);
v.push_back(s3);
vector<student>::iterator pos = find(v.begin(), v.end(), s1);
if (pos != v.end()) {
cout << "找到:" << pos->id << " " << pos->age << endl;
}
else {
cout << "没有找到!" << endl;
}
}
3.adjacent_find算法:
查找相邻的相同值元素 返回第一个元素的位置:
void test04() {
vector <int> v;
v.push_back(8);
v.push_back(2);
v.push_back(2);
v.push_back(5);
v.push_back(6);
vector<int>::iterator pos = adjacent_find(v.begin(),v.end());
if (pos == v.end())
{
cout << "没有找到" << endl;
}
else {
cout << "找到:" << *pos << endl;
}
}
4.binary_search
二分查找法:
需要原容器进行好排序
void test05() {
// binary_search需要对有序的元素进行查找
vector <int> v;
v.push_back(8);
v.push_back(2);
v.push_back(2);
v.push_back(5);
v.push_back(6);
sort(v.begin(), v.end()); // 排序
bool flag = binary_search(v.begin(), v.end(), 5);
if (flag) {
cout << "查找到!" << endl;
}
else {
cout << "没有查找到!" << endl;
}
}
5.count 算法 count_if算法
// count count_if
class mycompare06{
public:
bool operator()(int v) {
return v > 2;
}
};
void test06() {
vector <int> v;
v.push_back(8);
v.push_back(2);
v.push_back(2);
v.push_back(5);
v.push_back(6);
// count算法
int n = count(v.begin(), v.end(), 2);
cout << "n:" << n << endl;
// count_if
n = count_if(v.begin(), v.end(), mycompare06());
cout << "n:" << n << endl;
};
05常用排序算法
排序算法:需要容器支持随机访问
list不支持随机访问 所以list内部有一个自己的sort
merge
merge函数的作用是:将两个有序的序列合并为一个有序的序列
sort
random_shuffle
reverse
06常用的拷贝和替换算法
copy: 将容器内指定范围的元素拷贝到另一容器中
replace: 将容器内指定范围的旧元素修改为新元素
replace_if: 将容器内指定范围满足条件的元素替换为新元素
swap 交换两个容器的元素
copy:
replace, replace_if:
swap:
07上午课程回顾
08 常用的算术生成算法
accumulate 累加:
(累加完最后加了100)
fill 填充:
09常用的集合算法
求交集:set_intersection
求并集:set_union
求差集:set_difference
10 distance_逆序遍历_修改容器元素(补充)
distance 求两个迭代器之间的距离
for_each修改容器元素的值
for_each逆向遍历
11 演讲比赛思路
12演讲比赛框架搭建
13演讲比赛实现
14课程总体回顾
C++进阶 STL(3) 第三天 函数对象适配器、常用遍历算法、常用排序算法、常用算数生成算法、常用集合算法、 distance_逆序遍历_修改容器元素的更多相关文章
- python列表和字符串的三种逆序遍历方式
python列表和字符串的三种逆序遍历方式 列表的逆序遍历 a = [1,3,6,8,9] print("通过下标逆序遍历1:") for i in a[::-1]: print( ...
- C++ STL 之 函数对象适配器
谓词是指普通函数或重载的 operator()返回值是 bool 类型的函数对象(仿函数).如果operator 接受一个参数,那么叫做一元谓词,如果接受两个参数,那么叫做二元谓词,谓词可作为一个判断 ...
- 【实习记】2014-08-15文档太少看着源码用cgicc+stl库之模板谓词函数对象
总结1: 今天找到了昨天scanf的问题答案,scanf与printf一样的神奇而复杂,稍不留神,就会被坑.scanf函数在读入非空白符分割的多个字符串的解决方法是这个:/* 以 | 分割 * ...
- C++进阶 STL(2) 第二天 一元/二元函数对象、一元/二元谓词、stack容器、queue容器、list容器(双向链表)、set容器、对组、map容器
01 上次课程回顾 昨天讲了三个容器 string string是对char*进行的封装 vector 单口容器 动态数组 deque(双端队列) 函数对象/谓词: 一元函数对象: for_each ...
- STL算法设计理念 - 函数对象和函数对象当参数和返回值
函数对象: 重载函数调用操作符的类,其对象常称为函数对象(function object),即它们是行为类似函数的对象.一个类对象,表现出一个函数的特征,就是通过"对象名+(参数列表)&qu ...
- STL 算法中函数对象和谓词
STL 算法中函数对象和谓词 函数对象和谓词定义 函数对象: 重载函数调用操作符的类,其对象常称为函数对象(function object),即它们是行为类似函数的对象.一个类对象,表现出一个函数的特 ...
- STL算法设计理念 - 函数对象和函数对象当參数和返回值
函数对象: 重载函数调用操作符的类.其对象常称为函数对象(function object),即它们是行为类似函数的对象. 一个类对象,表现出一个函数的特征,就是通过"对象名+(參数列表)&q ...
- STL算法中函数对象和谓词
函数对象和谓词定义 函数对象: 重载函数调用操作符的类,其对象常称为函数对象(function object),即它们是行为类似函数的对象.一个类对象,表现出一个函数的特征,就是通过“对象名+(参数列 ...
- STL_iterator迭代器(3)——函数和函数对象
STL中,函数被称为算法,也就是说它们和标准C库函数相比,它们更为通用.STL算法通过重载operator()函数实现为模板类或模板函数.这些类用于创建函数对象,对容器中的数据进行各种各样的操作.下面 ...
随机推荐
- spring-boot-starter-actuator监控接口详解
spring-boot-starter-actuator 是什么 一句话,actuator是监控系统健康情况的工具. - 怎么用? 1. 添加 POM依赖 <dependency> < ...
- 0929关于MySQL操作规范(总结)
用户权限管理 创建用户 命令:CREATE USER 'username'@'host' IDENTIFIED BY 'password'; 说明: Username所创建的用户名 host 指定该用 ...
- 【ACM】poj_2210_Metric Time_201308011933
Metric TimeTime Limit: 1000MS Memory Limit: 65536K Total Submissions: 2550 Accepted: 783 Descripti ...
- 楼控-西门子-PPM设置及接线教程
第一部分:现场接线 1. 拨码:朝向数字那一端为0,远离数字那一端为1,PPM的地址设定方法就是将拨码器拨为跟系统架构表一样的数字,比如一个1U32的BACnet编号为77020,那么它的MAC地址就 ...
- [bzoj3717][PA2014]Pakowanie_动态规划_状压dp
Pakowanie bzoj-3717 PA-2014 题目大意:给你n个物品m个包,物品有体积包有容量,问装下这些物品最少用几个包. 注释:$1\le n\le 24$,$1\le m\le 100 ...
- Android ScrollView中嵌套ListView
由于要做一个相似美团的团购产品.scrollview中还有嵌入listview,要是直接把listview嵌进scrollview中.listview的高度是固定的不能进行滑动.默认情况下Androi ...
- [Javascript Crocks] Recover from a Nothing with the `coalesce` Method
The alt method allows us to recover from a nothing with a default Maybe, but sometimes our recovery ...
- BZOJ 3037 创世纪 树形DP
题目大意:给定一张有向图,每一个点有且仅有一条出边,要求若一个点x扔下去,至少存在一个保留的点y,y的出边指向x,求最多扔下去多少个点 首先原题的意思就是支配关系 我们反向考虑 求最少保留的点 要求一 ...
- C++设计模式之状态模式(二)
2.智能空调的设计与实现 某软件公司将开发一套智能空调系统: 系统检測到温度处于20---30度之间,则切换到常温状态:温度处于30---45度,则切换到制冷状态: 温度小于20度,则切换到制热状态. ...
- Linux命令(八)——vi编辑器的使用
vi编辑器是linux系统下的标准正文编辑器,有三种基本模式:命令行模式.插入模式和底行命令模式. 1.命令行模式:控制屏幕光标的移动,字符.字或行的删除,移动复制某区段及进入插入模式或底行命令模式下 ...