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()函数实现为模板类或模板函数.这些类用于创建函数对象,对容器中的数据进行各种各样的操作.下面 ...
随机推荐
- FADE:云存储中数据安全删除
FADE: Secure Overlay Cloud Storage with File Assured Deletion ,论文发表于SecureComm,C类. 香港大学的研究 ...
- 对Django框架中Cookie的简单理解
概念的理解:首先Cookie和Session一样,是django中用于视图保持状态的方案之一.为什么要进行视图保留呢,这是因为浏览器在向服务器发出请求时,服务器不会像人一样,有记忆,服务器像鱼一样,在 ...
- mysql 安装完毕后登陆不了mysql的 shell 即mysql>遇到:ERROR 1045 (28000): Access denied for user 'root'@'localhost‘
[root@hzswtb2-mpc ~]# mysql ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using pas ...
- java中byte类型
http://www.cnblogs.com/Robotke1/archive/2013/05/25/3099309.html ------------------------------------ ...
- Python:利用 selenium 库抓取动态网页示例
前言 在抓取常规的静态网页时,我们直接请求对应的 url 就可以获取到完整的 HTML 页面,但是对于动态页面,网页显示的内容往往是通过 ajax 动态去生成的,所以如果是用 urllib.reque ...
- swift 声明特性 类型特性
原文地址:http://www.cocoachina.com/newbie/basic/2014/0612/8801.html 特性提供了关于声明和类型的很多其它信息.在Swift中有两类特性,用于修 ...
- udev的使用-minicom没有权限打开串口,更改 ttyUSB0 的权限
udev的使用-minicom没有权限打开串口,更改 ttyUSB0 的权限 使用minicom打开串口会提示没有权限,必需要用 sudo,怎样更改串口设备的权限能够让普通用户读写呢? 事实上仅仅要更 ...
- [Linux]非常方便的上传下载文件工具rz和sz
linux上非常方便的上传下载文件工具rz和sz (本文适合linux入门的朋友) [一般用于SecureCRT ssh中使用] █ 法一:直接用yum安装lrzsz(推荐) yum insta ...
- 0x52 背包
还行 前面的题没啥意思 完全背包一个很难写的题poj1015 Jury Compromise poj1742 多重背包啊,开始写了二进制拆分TLE了,由于是判是否可以组成,那么可以用一个贪心的思想,顺 ...
- DDos攻击的一些领域知识——(流量模型针对稳定业务比较有效)不稳定业务采用流量成本的检测算法,攻击发生的时候网络中各个协议的占比发生了明显的变化
在过去,很多防火墙对于DDoS攻击的检测一般是基于一个预先设定的流量阈值,超过一定的阈值,则会产生告警事件,做的细一些的可能会针对不同的流量特征设置不同的告警曲线,这样当某种攻击突然出现的时候,比如S ...