STL算法设计理念 - 二元函数,二元谓词以及在set中的应用
demo 二元函数对象
#include <iostream>
#include <cstdio>
#include <vector>
#include <algorithm>
using namespace std;
template <typename T>
class SumVector
{
public:
T operator()(T t1, T t2) // 二元函数对象
{
return t1 + t2;
}
protected:
private:
};
void play01()
{
vector<int> v1, v2, v3;
v1.push_back(1);
v1.push_back(3);
v1.push_back(5);
v2.push_back(2);
v2.push_back(4);
v2.push_back(6);
v3.resize(10);
transform(v1.begin(), v1.end(), v2.begin(), v3.begin(), SumVector<int>());
/* transform函数原型
template<class _InIt1,
class _InIt2,
class _OutIt,
class _Fn2> inline
_OutIt transform(_InIt1 _First1, _InIt1 _Last1,
_InIt2 _First2, _OutIt _Dest, _Fn2 _Func)
{ // transform [_First1, _Last1) and [_First2, ...) with _Func
_DEBUG_RANGE(_First1, _Last1);
_DEBUG_POINTER(_Dest);
_DEBUG_POINTER(_Func);
if (_First1 != _Last1)
return (_Transform2(_Unchecked(_First1), _Unchecked(_Last1),
_First2, _Dest, _Func,
_Is_checked(_Dest)));
return (_Dest);
}
*/
// transform把运算结果迭代器的开始位置返回出来
for (vector<int>::iterator it = v3.begin(); it != v3.end(); ++it) {
cout << *it << ' ';
}
cout << endl;
// 3 7 11 0 0 0 0 0 0 0
}
int main()
{
play01();
return 0;
}
demo 二元谓词
#include <iostream>
#include <cstdio>
#include <vector>
#include <algorithm>
#include <ctime>
using namespace std;
void printVector(vector<int> &v)
{
for (vector<int>::iterator it = v.begin(); it != v.end(); ++it) {
cout << *it << ' ';
}
cout << endl;
}
void FuncShowElemt2(const int &t)
{
cout << t << ' ';
}
// 二元谓词
bool myCompare(const int &a, const int &b)
{
return a < b;
}
void play01()
{
vector<int> v(10);
srand(time(0));
for (int i = 0; i < 10; i++) {
int tmp = rand() % 100;
v[i] = tmp;
}
printVector(v);
// 90 19 94 50 90 90 24 50 30 74
for_each(v.begin(), v.end(), FuncShowElemt2);
cout << endl;
// 90 19 94 50 90 90 24 50 30 74
sort(v.begin(), v.end(), myCompare);
for_each(v.begin(), v.end(), FuncShowElemt2);
cout << endl;
// 0 8 14 23 32 33 44 45 63 80
}
int main()
{
play01();
return 0;
}
demo 二元谓词在set中的应用
#include <iostream>
#include <cstdio>
#include <set>
#include <algorithm>
#include <string>
using namespace std;
struct CompareNoCase
{
bool operator()(const string &str1, const string &str2)
{
string tmpstr1;
tmpstr1.resize(str1.size());
transform(str1.begin(), str1.end(), tmpstr1.begin(), tolower);
string tmpstr2;
tmpstr2.resize(str2.size());
transform(str2.begin(), str2.end(), tmpstr2.begin(), tolower);
return tmpstr1 < tmpstr2;
}
};
void play01()
{
set<string> set1;
set1.insert("lucifer");
set1.insert("zhang");
set1.insert("yaoqi");
set<string>::iterator it1 = set1.find("LUcifer"); // find函数默认区分大小写
if (it1 == set1.end()) {
cout << "find fail\n";
}
else {
cout << "find success\n";
}
// find fail
set<string, CompareNoCase> set2;
set2.insert("lucifer");
set2.insert("zhang");
set2.insert("yaoqi");
set<string, CompareNoCase>::iterator it2 = set2.find("LUcifer"); // find函数默认区分大小写
if (it2 == set2.end()) {
cout << "find fail\n";
}
else {
cout << "find success\n";
}
// find success
}
int main()
{
play01();
return 0;
}
STL算法设计理念 - 二元函数,二元谓词以及在set中的应用的更多相关文章
- STL算法设计理念 - 函数适配器
1)函数适配器的理论知识 2)常用函数函数适配器 标准库提供一组函数适配器,用来特殊化或者扩展一元和二元函数对象.常用适配器是: 1.绑定器(binder): binder通过把二元函数对象的一个实参 ...
- STL算法设计理念 - 谓词,一元谓词demo
谓词: 一元函数对象:函数参数1个: 二元函数对象:函数参数2个: 一元谓词 函数参数1个,函数返回值是bool类型,可以作为一个判断式 谓词可以使一个仿函数,也可以是一个回调函数. demo 一元谓 ...
- STL算法设计理念 - 函数对象和函数对象当参数和返回值
函数对象: 重载函数调用操作符的类,其对象常称为函数对象(function object),即它们是行为类似函数的对象.一个类对象,表现出一个函数的特征,就是通过"对象名+(参数列表)&qu ...
- STL算法设计理念 - 函数对象和函数对象当參数和返回值
函数对象: 重载函数调用操作符的类.其对象常称为函数对象(function object),即它们是行为类似函数的对象. 一个类对象,表现出一个函数的特征,就是通过"对象名+(參数列表)&q ...
- STL算法设计理念 - 预定义函数对象
预定义函数对象基本概念:标准模板库STL提前定义了很多预定义函数对象 1)使用预定义函数对象: #include <iostream> #include <cstdio> #i ...
- C++ STL算法系列1---count函数
一.count函数 algorithm头文件定义了一个count的函数,其功能类似于find.这个函数使用一对迭代器和一个值做参数,返回这个值出现次数的统计结果. 编写程序读取一系列int型数据,并将 ...
- C++ STL算法系列6---copy函数
现在我们来看看变易算法.所谓变易算法(Mutating algorithms)就是一组能够修改容器元素数据的模板函数,可进行序列数据的复制,变换等. 我们现在来看看第一个变易算法:元素复制算法copy ...
- 【转】三十分钟学会STL算法
转载自: http://net.pku.edu.cn/~yhf/UsingSTL.htm 这是本小人书.原名是<using stl>,不知道是谁写的.不过我倒觉得很有趣,所以化了两个晚上把 ...
- C++进阶 STL(2) 第二天 一元/二元函数对象、一元/二元谓词、stack容器、queue容器、list容器(双向链表)、set容器、对组、map容器
01 上次课程回顾 昨天讲了三个容器 string string是对char*进行的封装 vector 单口容器 动态数组 deque(双端队列) 函数对象/谓词: 一元函数对象: for_each ...
随机推荐
- Gazebo機器人仿真學習探索筆記(六)工具和实用程序
Gazebo附带了许多工具和实用程序. 这些教程说明了这些可用的工具,以及如何使用它们. 主要有: 1 记录和播放 2 日志过滤 3 应用力/扭矩 4 HDF5数据集 官网介绍通俗具体,非常容易,请参 ...
- [csdn markdown]使用摘记二 快捷键及导入导出Markdown文件
csdn推出了新的编辑器markdown,对于习惯使用离线编辑的人员来说是个大的福利,比如上班的时候,不能联网,但是又有好些知识点需要记录,等到下班了呢,又想直接把这些排版格式良好的文件直接上传到cs ...
- SELinux策略语言--客体类别和许可
1. 简介 SELinux策略语言主要描述policy.conf的相关语法,其相关部分如下图所示: 2. 客体类别 定义内核支持的客体类别和许可的策略语言指令,并对SELinux系统中内核客体类别标准 ...
- androidApp的完全退出
思路:搜集整个工程所有的activity,通过循环把工程中所有的activity都关闭. 搜集工程中的activity,可以由单例模式实现, [java] view plaincopy import ...
- Impala中的代码生成技术
Cloudera Impala是一种为Hadoop生态系统打造的开源MPP(massive parallel processing)数据库,它主要为分析型查询负载而设计,而非OLTP.Impala能最 ...
- android最新更新方法
使用SDK Manager更新时出现问题Failed to fetch URL https://dl-ssl.google.com/android/repository/repository-6.xm ...
- RPCZ中的智能指针单例
RPCZ中的智能指针单例 (金庆的专栏) 智能指针单例应用于 RPCZ 库以实现库的自动初始化与自动清理. RPCZ: RPC implementation for Protocol Buffers ...
- Ext JS 6开发实例(四) :调整主视图
上文把主界面设置好,但是主视图因为界面的微调出现了显示问题,本文将把它调整好了. 打开app/view/main/Main.js,可以看到主视图是派生于标签面板(Ext.tab.Panel)的.在视图 ...
- C语言--static修饰变量
Static在C语言里面有两个作用,第一个是修饰变量,第二个是修饰函数. 1.Static修饰变量 按照作用范围的不同,变量分为局部变量和全局变量.如果用static修饰变量,不论这个变量是全局的还是 ...
- 程序员大牛 Jeff Atwood 的两本中文书
程序员大牛,StackOverflow.com创始人之一--Jeff Atwood 英文博客:http://blog.codinghorror.com <高效能程序员的修炼>,人民邮电出版 ...