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()函数实现为模板类或模板函数.这些类用于创建函数对象,对容器中的数据进行各种各样的操作.下面 ...
随机推荐
- (32)Spring Boot使用@SpringBootApplication注解,从零开始学Spring Boot
[来也匆匆,去也匆匆,在此留下您的脚印吧,转发点赞评论] 如果看了我之前的文章,这个节你就可以忽略了,这个是针对一些刚入门的选手存在的困惑进行写的一篇文章. 很多Spring Boot开发者总是使用 ...
- mongodb--find基础用法
聚集集合查询 1.查询所有记录 db.userInfo.find(); 相当于:select* from userInfo; 默认每页显示20条记录,当显示不下的情况下,可以用it迭代命令查询下一页数 ...
- MySQL命名、设计及使用规范《MySQL命名、设计及使用规范》
数据库环境 dev:开发环境,开发可读写,可修改表结构.开发人员可以修改表结构,可以随意修改其中的数据但是需要保证不影响其他开发同事. qa:测试环境,开发可读写,开发人员可以通过工具修改表结构. s ...
- Qt 3D的研究(十):描边渲染(轮廓渲染)以及Silhouette Shader
Qt 3D的研究(十):描边渲染(轮廓渲染)以及Silhouette Shader 之前写了两篇文章,介绍了我在边缘检測上面的研究.实际上.使用GPU对渲染图像进行边缘检測.前提是须要进行两遍渲染.前 ...
- hdu 5411 CRB and Puzzle 矩阵高速幂
链接 题解链接:http://www.cygmasot.com/index.php/2015/08/20/hdu_5411/ 给定n个点 常数m 以下n行第i行第一个数字表示i点的出边数.后面给出这些 ...
- gcc 4.8安装
suse的安装参考:http://blog.csdn.net/cloudskyfhx/article/details/17660607 有些错误处理见本文黄色部分 CentOS 6.4 编译安装 gc ...
- LDA解决的问题
人类是怎么生成文档的呢?LDA的这三位作者在原始论文中给了一个简单的例子.比如假设事先给定了这几个主题:Arts.Budgets.Children.Education,然后通过学习训练,获取每个主题T ...
- 国王的烦恼---nyoj
国王的烦恼 时间限制:3000 ms | 内存限制:65535 KB 难度:2 描述 C国由n个小岛组成,为了方便小岛之间联络,C国在小岛间建立了m座大桥,每座大桥连接两座小岛.两个小岛间可能存在 ...
- Asura监控---AsuraMonitor,阿修罗监控开源
阿修罗Monitor是一个功能强大.灵活的监控系统. 系统安装简单,配置简单,相比zabbix, nagios,cacti,小米监控等都使用相当简单.只需要会写脚本,语言不限就可以实现任意监控需求. ...
- [HTML5] 新标签解释及用法
转自:http://www.cnblogs.com/yuzhongwusan/archive/2011/11/17/2252208.html HTML 5 是一个新的网络标准,目标在于取代现有的 HT ...