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()函数实现为模板类或模板函数.这些类用于创建函数对象,对容器中的数据进行各种各样的操作.下面 ...
随机推荐
- 洛谷—— P2690 接苹果
https://www.luogu.org/problem/show?pid=2690 题目背景 USACO 题目描述 很少有人知道奶牛爱吃苹果.农夫约翰的农场上有两棵苹果树(编号为1和2), 每一棵 ...
- vim编辑强制执行命令
vim进入文件,输入i编辑好文件,按esc,输入冒号,再输入底下代码 :w !sudo tee %
- [Angular] Upgrading to RxJS v6
This is just a learning blog post, check out the talk. 1. Custom pipeable operators: Custom pipeable ...
- iOS 在 ARC 环境下 dealloc 的使用、理解误区
iOS 在 ARC 环境下 dealloc 的使用.理解误区 太阳火神的漂亮人生 (http://blog.csdn.net/opengl_es) 本文遵循"署名-非商业用途-保持一致&qu ...
- linux命令用来查看日志关键字
1.查看日志 前 n行: cat 文件名 | head -n 数量 demo: cat test.log | head -n 200 # 查看test.log前200行 2.查看日志 尾 n行: c ...
- redis之Hash存储与String存储内存消耗对照
存储对象User String存储方式: SET media:1155315 939 GET media:1155315 > 939 String结构存储该对象 User243 243600 存 ...
- HDU 5218 The E-pang Palace (简单几何—2014广州现场赛)
题目链接:pid=5128">http://acm.hdu.edu.cn/showproblem.php? pid=5128 题面: The E-pang Palace Time Li ...
- [HDU 6318] Swaps and Inversions
[题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=6318 [算法] 线段树 / 树状数组 [代码] #include<bits/stdc++.h ...
- 【POJ 3744】 Scout YYF I
[题目链接] http://poj.org/problem?id=3744 [算法] 概率DP + 矩阵乘法 [代码] #include <algorithm> #include < ...
- Node.js:多进程
ylbtech-Node.js:多进程 1.返回顶部 1. Node.js 多进程 我们都知道 Node.js 是以单线程的模式运行的,但它使用的是事件驱动来处理并发,这样有助于我们在多核 cpu 的 ...