【C++STL标准库】算法,仿函数与空间适配器

news2024/10/11 6:32:11

仿函数:

长得像函数,但是不是函数
实际上就是在类或结构体中重载了()运算符

  • 结构体仿函数:
struct aMax {
    int operator()(int a, int b) {
        return a > b ? a : b;
    }
};
  • 类仿函数:
class Max{
public:
    int operator()(int a, int b) {
        return a > b ? a : b;
    }
};
  • 使用:
int main() {
	//仿函数
	int a = Max()(5, 6);
	int b = aMax()(9, 10);
	std::cout << a << std::endl;
	std::cout << b << std::endl;
	return 0;
}
  • 运行截图:

仿函数

空间适配器

基本概念这里就不浪费时间介绍了,代码中有介绍到,这里给出空间适配器的基本使用方式:

#include <iostream>
#include <string>

class Max{
public:
	int operator()(int a, int b) {
		return a > b ? a : b;
	}
};

struct aMax {
	int operator()(int a, int b) {
		return a > b ? a : b;
	}
};

int main() {
	//仿函数
	int a = Max()(5, 6);
	int b = aMax()(9, 10);
	std::cout << a << std::endl;
	std::cout << b << std::endl;
	//控制适配器
	//控制适配器的类型
	std::allocator<int> obj;
	int* p = obj.allocate(1);//这里实际上是申请了1个int的空间
	obj.construct(p, 12138);//将p地址的值修改为12138
	std::cout << *p << std::endl;
	*p = 100;//直接解引用也可以使用
	std::cout << *p << std::endl;
	int temp = 500;
	//address方法:获取指定类型,指定元素的指针,返回值类型:T*
	std::cout << typeid(obj.address(temp)).name() << std::endl;
	int *bAddr =obj.address(temp);
	std::cout << bAddr << "\t" << *bAddr << std::endl;
	//max_size方法,返回适配器的最大尺寸,返回值类型:unsigned int
	std::cout << typeid(obj.max_size()).name() << std::endl;
	std::cout << obj.max_size() << std::endl;
	//destory方法:释放对象空间
	obj.destroy(p);
	//deallocate方法:释放指定空间,指定大小
	obj.deallocate(p, 1);
	return 0;
}

STL算法:

基本概念这里就不浪费时间介绍了,代码中有介绍到:

#include <iostream>
#include <algorithm>
#include <vector>

struct Func {
	bool operator()(int a) {
		return a == 6;
	}
};

bool Fun5(int a) {
	return a == 5;
}

template <typename T>
void print(T Begin, T End);

void print1(int a);

int main() {
	std::vector<int> oec = { 0,4,2,3,6,8,7,51,2,2,2,2,2,2 };
	//find算法:这里介绍两种,第一种:find(起始迭代器,终止迭代器,要寻找的值)
	auto it = std::find(oec.begin(), oec.end(), 6);
	std::cout << typeid(it).name() << std::endl;
	if (it != oec.end()) {
		std::cout << "successful" << std::endl;
	}
	else {
		std::cout << "failed" << std::endl;
	}
	//第二种:find_if(起始迭代器,终止迭代器,仿函数/函数)
	auto it1 = std::find_if(oec.begin(), oec.end(), Func());
	if (it1 != oec.end()) {
		std::cout << "successful" << std::endl;
	}
	else {
		std::cout << "failed" << std::endl;
	}
	auto it2 = std::find_if(oec.begin(), oec.end(), Fun5);
	if (it2 != oec.end()) {
		std::cout << "successful" << std::endl;
	}
	else {
		std::cout << "failed" << std::endl;
	}
	//在父串中找字串,返回值类型:迭代器类型,指向第一次出现的位置
	std::vector<int> obj = { 2,3 };
	std::find_first_of(oec.begin(), oec.end(), obj.begin(), obj.end());
	std::cout << typeid(std::find_first_of(oec.begin(), oec.end(), obj.begin(), obj.end())).name() << std::endl;
	//search_n方法:
	std::search_n(oec.begin(), oec.end(), 4, 2);
	std::cout << typeid(std::search_n(oec.begin(), oec.end(), 4, 2)).name() << std::endl;


	//count方法:统计容器中,某个元素出现的次数,返回值类型:int
	std::count(oec.begin(), oec.end(), 2);
	std::cout << typeid(std::count(oec.begin(), oec.end(), 2)).name() << std::endl;
	std::cout << std::count(oec.begin(), oec.end(), 2) << std::endl;
	//count_id方法,与上述find与find_if方法差别相似
	std::count_if(oec.begin(), oec.end(), Func());
	std::cout << typeid(std::count_if(oec.begin(), oec.end(), Func())).name() << std::endl;
	std::cout << std::count_if(oec.begin(), oec.end(), Func()) << std::endl;

	//排序算法
	//1.排序,默认greater排序
	std::sort(oec.begin(), oec.end());
	print(oec.begin(), oec.end());
	std::cout << "*********************************************************************" << std::endl;
	//2.显示指定排序规则
	std::sort(oec.begin(), oec.end(), std::greater<int>());
	print(oec.begin(), oec.end());
	std::cout << "*********************************************************************" << std::endl;

	//从begin迭代器到end迭代器,每一个元素都执行print1函数
	std::for_each(oec.begin(), oec.end(), print1);
	std::cout << std::endl;
	std::cout << "*********************************************************************" << std::endl;

	//堆排序
	//1.
	std::make_heap(oec.begin(), oec.end(), std::greater<int>());
	std::for_each(oec.begin(), oec.end(), print1);
	std::cout << std::endl;
	std::cout << "*********************************************************************" << std::endl;
	//2.
	std::sort_heap(oec.begin(), oec.end(), std::greater<int>());
	std::for_each(oec.begin(), oec.end(), print1);
	std::cout << std::endl;
	std::cout << "*********************************************************************" << std::endl;

	//replace算法:修改容器中的值
	std::replace(oec.begin(), oec.end(), 3, 12345);
	std::for_each(oec.begin(), oec.end(), print1);
	std::cout << std::endl;
	std::cout << "*********************************************************************" << std::endl;

	fill算法:将所有元素重新赋值
	//std::fill(oec.begin(), oec.end(), 555);
	//std::for_each(oec.begin(), oec.end(), print1);
	//std::cout << std::endl;
	//std::cout << "*********************************************************************" << std::endl;

	//remove算法:删除指定元素
	std::remove(oec.begin(), oec.end(), 12345);
	std::for_each(oec.begin(), oec.end(), print1);
	std::cout << std::endl;
	std::cout << "*********************************************************************" << std::endl;

	//reverse算法:将所有元素逆序
	std::reverse(oec.begin(), oec.end());
	std::for_each(oec.begin(), oec.end(), print1);
	std::cout << std::endl;
	std::cout << "*********************************************************************" << std::endl;

	return 0;
}

template<typename T>
void print(T Begin, T End)
{
	T i;
	for (i = Begin; i != End; i++) {
		std::cout << *i << std::endl;
	}
	std::cout << std::endl;
}

void print1(int a)
{
	std::cout << a << "\t";
}

  • 运行截图:
    STL算法

如果发现文章中有错误,还请大家指出来,我会非常虚心地学习,我们一起进步!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/789946.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

YOLO 划分数据集(训练集、验证集、测试集)

目录 前言训练集、验证集&#xff08;8:2&#xff09;训练集、验证集、测试集&#xff08;7:2:1&#xff09; 前言 本博客是在我的另一篇博客 VOC 格式与 YOLO 格式的相互转换 的基础上进行的&#xff0c;有需要可以参考 以下代码亲测可以直接复制运行&#xff08;以下所有的路…

13.5 【Linux】使用者的特殊 shell 与 PAM 模块

13.5.1 特殊的 shell, /sbin/nologin 我们所谓的“无法登陆”指的仅是&#xff1a;“这个使用者无法使用 bash 或其他 shell 来登陆系统”而已&#xff0c;并不是说这个帐号就无法使用其他的系统资源。举例来说&#xff0c;各个系统帐号&#xff0c;打印工作由 lp这个帐号在管…

【100天精通python】Day15:python 第三方模块和包,模块如何以主程序形式执行

目录 1 常用的第三方模块 2. 第三方模块的安装和使用 2.1 安装第三方模块&#xff1a; 2.2 导入第三方模块&#xff1a; 2.3 使用第三方模块&#xff1a; 3 模块以主程序形式执行 4 python 中的包 4.1 python程序的包结构 4.2 创建包 4.3 python中包的导入和使用 5 …

不同起点转角相遇,从抖音和小红书看「社区产品」宿命 | 融云观察

点击报名 8 月 3 日&#xff08;周四&#xff09;融云直播课~ 作为社交产品全球热点&#xff0c;Threads 偷袭 Twitter 以及由此升级的马斯克和扎克伯格约架给全球用户上演了一出好戏。关注【融云全球互联网通信云】了解更多 别打啦~ 马斯克直接在新闻下面回复“竞争可以&#…

Ubuntu 22.04下对无线网络作静态ip设置

内容如题所示&#xff0c;最近本人安全毕业&#xff0c;参加工作了&#xff0c;此处应有鲜花和掌声&#xff0c;哈哈哈。但新的生活总是有很多的小问题&#xff0c;坎坎坷坷&#xff0c;所以&#xff0c;我继续记录工作和学习生活中遇到的问题。 今天带我的云哥给了我一个ip&am…

Docker——compose单机容器集群编排

Docker——compose单机容器集群编排 一、Docker-compose概述1.为何需要Docker-compose2.Docker-compose 的特征3.Docker-compose 的优势4.Docker-compose 的劣势5.Docker-compose 的生产环境 二、Docker Compose 环境安装三、YAML 文件格式及编写注意事项四、Docker Compose配置…

最快桌面UI:Siticone Desktop UI 2.1.1 cRACK

富图尔主义控制 80 多个 .NET UI 组件和控件 现代未来 UI/UX 组件 为 Visual Studio 开发做好准备 无限的免费产品支持案例 超轻量和快速性能 广泛可定制和主题化 低资源消耗和占地面积 免版税开发和部署 NET 的最佳 UI 和 UX 库 从最好的图书馆探索无缝流畅的体验 使…

vue项目 运行时出现It works!却不显示页面 问题解决方案

问题描述 运行一个vue项目时&#xff0c;一切正常&#xff0c;没有报错&#xff0c;但是点开网页链接后&#xff0c;显示空白页面&#xff0c;空白页面上有个It works&#xff01; 如图所示 问题分析 It works&#xff01;页面出现说明vue项目配置正常&#xff0c;但是无法显示…

JenKins工作流程

程序员提交代码到Git/SVN仓库&#xff0c;触发钩子程序向 JenKins 进行通知&#xff0c;Jenkins 调用Git/SVN插件获取源码&#xff0c;调用Maven打包为war包&#xff0c;调用Deploy to web container插件部署到Tomcat服务器。

【AST抽象语法树】结构分析及特性

什么是AST? AST译名抽象语法树&#xff08;Abstract Syntax Tree&#xff09;&#xff0c;是一种用于表示源代码结构的数据结构。 它在编译器、解析器和静态代码分析等领域中被广泛使用。 AST结构分析 我们利用成熟的astexplorer来进行结构化的比较和分析。可以尝试登录以下网…

Fiddler学习笔记

Fiddler简介 学习Fiddler的基础前置知识 请求行又包括请求方法&#xff0c;统一资源定位符、请求协议及版本号 统一资源定位符就是资源的绝对路径 请求体里写服务器需要的参数 304是服务器没有变化&#xff0c;根据请求头发现请求的内容和本地一样&#xff0c;就不再发回来了 …

【雕爷学编程】Arduino动手做(172)---WeMos D1开发板模块2

37款传感器与执行器的提法&#xff0c;在网络上广泛流传&#xff0c;其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块&#xff0c;依照实践出真知&#xff08;一定要动手做&#xff09;的理念&#xff0c;以学习和交流为目的&am…

7.python设计模式【桥结模式】

内容&#xff1a;将一个事物的两个维度分离&#xff0c;使其都可以独立变化角色&#xff1a; 抽象&#xff08;Abstraction&#xff09;细化抽象&#xff08;RefinedAbstraction&#xff09;实现者&#xff08;Implementor&#xff09;具体实现者&#xff08;ConcreteImplement…

Ubuntu16.04LTS安装ROS测试小海龟样例

一、参考资料 在Ubuntu中安装ROS Kinetic ROS安装ubuntu16.04 无需科学上网解决sudo rosdep init初始化问题 二、安装ROS关键步骤 1. 选择ROS版本 ROS安装选择 Ubuntu版本不同&#xff0c;对应安装的ROS版本也不同&#xff0c;务必版本对齐&#xff1b;Kinetic版本的ROS对…

iPortal 注册登录模块扩展开发

作者&#xff1a;yx 文章目录 前言一、示例代码简介二、对接 iPortal REST API 接口2.1、登录模块扩展开发2.2、注册模块扩展开发 三、页面内容及样式实现四、配置启用定制页面 前言 针对注册登录模块&#xff0c;iPortal 允许用户通过 iFrame 方式接入自行开发的页面&#xf…

JavaWeb开发(后端Web开发【一】)

文章目录 前言一、Maven1.Maven概述-介绍1.1.Maven概述-介绍1.2.Maven概述-安装 2.IDEA集成Maven2.1.IDEA集成Maven-配置Maven环境2.2.IDEA集成Maven-创建Maven项目2.3.IDEA集成Maven-导入Maven项目 3.Maven-依赖管理3.1.Maven-依赖管理-依赖配置3.2.Maven-依赖管理-依赖传递3.…

Unity小游戏——怪物出现模式的管理

摘要&#xff1a;游戏启动后不久&#xff0c;画面前方将出现怪物&#xff0c;游戏的目标是不停地看到怪物并持续前进 一、怪物出现的时间节点 我们首先来看如何来确定怪物出现的间隔。 若是怪物相继出现的时间间隔很短&#xff0c;玩家就必须快速地点击按键&#xff0c;这样游…

目前新能源汽车充电桩的发展受到哪些不利因素的影响?

目前新能源汽车充电桩的发展受到哪些不利因素的影响? 一是安装难&#xff0c;很多老旧小区没有充电桩配套施工规范&#xff0c;充电桩建设比较难&#xff0c;受到充电容量不足电表箱供电等局限性的制约&#xff0c;同时缺乏充电桩配套设施的统一规划&#xff0c;小区内只能安装…

元学习(小样本)-基本概念

机器学习 概述 以分类任务为例&#xff0c;机器学习可以看作是找一个猫狗的分类函数。 step1: 设计未知函数&#xff1b;其中&#xff0c;权重和偏置都是神经元中位置参数&#xff08;可学习的&#xff09;&#xff1b;step2: 定义损失函数&#xff1b;step3&#xff1a;训练…