C++之STL算法(1)

  STL容器算法主要由、、组成;
  algorithm主要有遍历、比较、交换、查找、拷贝、修改等;

1.遍历容器for_each

  for_each()函数用于完成容器遍历,函数参数如下:

for_each(_InIt _First, _InIt _Last, _Fn _Func)
形参:_First、_Last --容器的起始和结束迭代器
     _Func -->仿函数(回调函数),处理要输出的信息

1.1 vector容器遍历

  自定义数据格式:

class Person
{
	friend class mycompare;
	friend class Myprint;//友元类
	friend void Print(const Person& p);//友元函数
public:
	Person() {}
	Person(string name, int age) :name(name), age(age) {

	}
	Person(const Person& p)
	{
		name = p.name;
		age = p.age;
	}
	bool operator<(const Person& p)const
	{
		if (this->age == p.age)
		{
			return p.name < p.name;
		}
		return this->age > p.age;
	}
private:
	string name;
	int age;
};
void Print(const Person& p)
{
	cout << "姓名:" << p.name << "\t年龄:" << p.age << endl;
}
class Myprint
{
public:
	void operator()(const Person& p)
	{
		cout << "姓名:" << p.name << "\t年龄:" << p.age << endl;
	}
	void operator()(const pair<Person, int>& p)
	{
		cout << "姓名:" << (p.first).name << "\t年龄:" << (p.first).age << "\t成绩:" << p.second << endl;
	}
};
class mycompare
{
public:
	bool operator()(const Person& p1,const Person& p2)const
	{
		if (p1.age == p2.age)
		{
			return p1.name < p2.name;
		}
		return p1.age > p2.age;
	}
};
void vector_test()
{
	cout << "\tvector容器示例:" << endl;
	//创建vector容器--->单端数组
	vector<Person>vtr;
	vtr.push_back(Person("小王", 18));
	vtr.push_back(Person("小林", 18));
	vtr.push_back(Person("小李", 18));
	vtr.push_back(Person("小刘", 18));
	cout << "提供一个函数示例:" << endl;
	for_each(vtr.begin(), vtr.end(), Print);
	cout << "提供一个仿函数示例:" << endl;
	for_each(vtr.begin(), vtr.end(), Myprint());
}

1.2 list容器遍历

void list_test()
{
	//创建一个list容器-->双向链表
	cout << "\tlist容器示例:" << endl;
	list<Person> t;
	t.push_back(Person("小王", 18));//尾插
	t.push_front(Person("小林", 18));//头插
	t.push_back(Person("小李", 18));
	t.push_back(Person("小刘", 18));
	cout << "提供一个仿函数示例:" << endl;
	for_each(t.begin(), t.end(), Myprint());
}

1.3 set容器遍历

void set_test()
{
	cout << "\tset/multiset关联式容器:" << endl;
	multiset<Person>mt;//该容器会自动排序
	mt.insert(Person("小王", 18));
	mt.insert(Person("小林", 18));
	mt.insert(Person("小李", 17));
	mt.insert(Person("小刘", 18));
	mt.insert(Person("小李", 22));
	for_each(mt.begin(), mt.end(), Myprint());

	cout << "\tset/multiset关联式容器(仿函数示例):" << endl;
	multiset<Person, mycompare>mt2;
	mt2.insert(Person("小王", 18));
	mt2.insert(Person("小林", 18));
	mt2.insert(Person("小李", 17));
	mt2.insert(Person("小刘", 18));
	mt2.insert(Person("小李", 22));
	for_each(mt.begin(), mt.end(), Myprint());
}

1.4 map容器遍历

void map_test()
{
	cout << "\tmap关联式容器示例:" << endl;
	multimap<Person, int>mp;
	mp.insert(make_pair(Person("小王", 18), 88));
	mp.insert(pair<Person,int>(Person("小林", 18),99));
	mp.insert(pair<Person, int>(Person("小李", 17), 95));
	mp.insert(pair<Person, int>(Person("小刘", 18), 95));
	mp.insert(pair<Person, int>(Person("小李", 22), 90));
	for_each(mp.begin(), mp.end(), Myprint());
}

1.5 整体运行效果

int main()
{
	vector_test();//vector容器
	list_test();//list容器
	set_test();//set容器
	map_test();//map容器
	system("pause");
}

在这里插入图片描述

2.转移元素transform

transform函数:
	transform(const _InIt _First, const _InIt _Last, _OutIt _Dest, _Fn _Func)
	将一个函数中的元素拷贝到另一个容器中,
	_First、_Last --要转移的容器的起始迭代器和结束迭代器
	_Dest --目标容器的起始迭代器
	_Func --仿函数,支持一元运算,可以对当前值进行+ - *  等各种运算
  • 使用示例:
#include <iostream>
using namespace std;
#include <algorithm>
#include <vector>
/*
transform函数:
	transform(const _InIt _First, const _InIt _Last, _OutIt _Dest, _Fn _Func)
	将一个函数中的元素拷贝到另一个容器中,
	_First、_Last --要转移的容器的起始迭代器和结束迭代器
	_Dest --目标容器的起始迭代器
	_Func --仿函数,支持一元运算,可以对当前值进行+ - * \ 等各种运算
*/
class myprint
{
public:
	void operator()(int val)
	{
		cout << val << " ";
	}
};
class myfunc
{
public:
	int operator()(int val1)
	{
		return val1;
	}
};

void test()
{
	vector<int>t1;
	for (int i = 0; i < 10; i++)
	{
		int temp = rand() % 101;
		t1.push_back(temp);
	}
	cout << "原容器数据:" << endl;
	for_each(t1.begin(), t1.end(), myprint());
	cout << endl;
	vector<int>target;
	target.resize(t1.size());//设置target容器大小
	transform(t1.begin(), t1.end(), target.begin(), myfunc());
	cout << "转移后的容器内容:" << endl;
	for_each(target.begin(), target.end(), myprint());
	cout << endl;
}
int main()
{
	test();
	system("pause");
}

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

mybatis多表映射-延迟加载,延迟加载的前提条件是:分步查询

1、建库建表 create database mybatis-example; use mybatis-example; create table t_book (bid varchar(20) primary key,bname varchar(20),stuid varchar(20) ); insert into t_book values(b001,Java,s001); insert into t_book values(b002,Python,s002); insert into …

基于 librosa和soundfile对音频进行重采样 (VITS 必备)

基于 librosa和soundfile对音频进行重采样 一、前言 在玩bert-vits2的时候有对音频进行重采样的需求&#xff0c;故写了一下批量对音频进行重采样的脚本。 优化点&#xff1a; 根据机器自适应线程数为最多&#xff0c;保证充分利用机器资源&#xff0c;提高速度>30%。支持…

UE引擎 LandscapeGrass 实现机制分析(UE5.2)

前言 随着电脑和手机硬件性能越来越高&#xff0c;游戏越来越追求大世界&#xff0c;而大世界非常核心的一环是植被&#xff0c;目前UE5引擎提供给植被生成的主流两种方式为 手刷植被和LandscapeGrass(WeightMap程序化植被)。当然UE5.3推出新一代PCGFramework 节点程序化生成框…

Android 顶部对齐宽度撑满高度等比例缩放及限制最大最小高度

一 示例 二 代码 <?xml version"1.0" encoding"utf-8"?> <FrameLayout xmlns:android"http://schemas.android.com/apk/res/android"android:layout_width"match_parent"android:layout_height"match_parent&qu…

点评项目——秒杀优化

2023.12.11 上一张的秒杀券下单还可以进行优化&#xff0c;先来回顾一下下单流程&#xff1a; 可以看出流程设计多次查询和操作数据库的操作&#xff0c;并且执行顺序是一个线程串行执行&#xff0c;执行性能是比较低的。 优化方案&#xff1a;我们将判断秒杀库存和校验一人一单…

蓝桥杯周赛 第 1 场 强者挑战赛 6. 小球碰撞【算法赛】(思维题/最长上升子序列LIS)

题目 https://www.lanqiao.cn/problems/9494/learning/?contest_id153 思路来源 Aging代码 题解 二分时间t&#xff0c;第i个小球对应一个起点pi、终点pit*vi的区间&#xff0c;问题转化为&#xff0c; 选最多的区间&#xff0c;使得不存在区间包含&#xff08;即li<l…

第二百零一回 介绍一个三方包open_settings

文章目录 1. 概念介绍2 使用方法3 代码与效果3.1 示例代码3.2 运行效果 4. 经验分享 我们在上一章回中介绍了Form Widget相关的内容&#xff0c;本章回中将介绍Form系列组件的验证与提交功能.闲话休提&#xff0c;让我们一起Talk Flutter吧。 1. 概念介绍 我们在这里说的的验…

【电路笔记】-电位器

电位器 文章目录 电位器1、概述2、电位器类型2.1 旋转电位器2.2 滑块电位器2.3 预设和微调电位器2.4 变阻器 3、电位器示例14、电位器作为分压器5、电位器示例26、变阻器6、滑块变阻器7、线性或对数电位器8、总结 当连接的轴物理旋转时&#xff0c;电位计和变阻器的电阻值会发生…

23种设计模式之装饰者模式(被装饰者,接口层,装饰抽象层,具体装饰者)

23种设计模式之装饰者模式 文章目录 23种设计模式之装饰者模式设计思想装饰者模式的优点装饰者模式的缺点装饰者模式的优化方法UML 解析预设场景 代码释义总结 设计思想 原文:装饰器模式&#xff08;Decorator Pattern&#xff09;允许向一个现有的对象添加新的功能&#xff0…

【EMNLP 2023】面向垂直领域的知识预训练语言模型

近日&#xff0c;阿里云人工智能平台PAI与华东师范大学数据科学与工程学院合作在自然语言处理顶级会议EMNLP2023上发表基于双曲空间和对比学习的垂直领域预训练语言模型。通过比较垂直领域和开放领域知识图谱数据结构的不同特性&#xff0c;发现在垂直领域的图谱结构具有全局稀…

做数据分析为何要学统计学(3)——何为置信区间?它有什么作用?

置信区间是统计学中的一个重要工具&#xff0c;用以使用样本参数()来估计总体均值在某置信水平下的范围。通俗一点讲&#xff0c;如果置信度为95%&#xff08;等价于显著水平a0.05&#xff09;&#xff0c;置信区间为[a,b]&#xff0c;这就意味着总体均值落入该区间的概率为95%…

虹科Pico汽车示波器 | 汽车免拆检修 | 2019款别克GL8豪华商务车前照灯水平调节故障

一、故障现象 一辆2019款别克GL8豪华商务车&#xff0c;搭载LTG发动机&#xff0c;累计行驶里程约为10.7万km。车主反映&#xff0c;车辆行驶过程中组合仪表提示前照灯水平调节故障。 二、故障诊断 接车后试车&#xff0c;起动发动机&#xff0c;组合仪表上提示“前照灯水平调节…

Spring Boot监听redis过期的key

Redis支持过期监听&#xff0c;可以实现监听过期数据&#xff0c;实现过程如下 1、pom依赖 <!-- Redis--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></depend…

ChatGPT/GPT4应用:文本、论文、编程、绘图等,提高工作效率及科研项目开发能力

2023年随着OpenAI开发者大会的召开&#xff0c;最重磅更新当属GPTs&#xff0c;多模态API&#xff0c;未来自定义专属的GPT。微软创始人比尔盖茨称ChatGPT的出现有着重大历史意义&#xff0c;不亚于互联网和个人电脑的问世。360创始人周鸿祎认为未来各行各业如果不能搭上这班车…

深入理解模板引擎:解锁 Web 开发的新境界(下)

&#x1f90d; 前端开发工程师&#xff08;主业&#xff09;、技术博主&#xff08;副业&#xff09;、已过CET6 &#x1f368; 阿珊和她的猫_CSDN个人主页 &#x1f560; 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 &#x1f35a; 蓝桥云课签约作者、已在蓝桥云…

Android蓝牙协议栈fluoride(五) - 设备管理(bt application)

在上一篇Android蓝牙协议栈fluoride(四) - 设备管理(bt interface) 中梳理了设备管理器对上层提供的接口&#xff0c;本文将介绍这些接口的具体实现。 各个模块中采用了API状态机数据收发的方式&#xff0c;介绍设备管理时也将采用这个顺序介绍。 核心数据结构 设备管理的核…

鸿蒙HarmonyOS4.0 入门与实战

一、开发准备: 熟悉鸿蒙官网安装DevEco Studio熟悉鸿蒙官网 HarmonyOS应用开发官网 - 华为HarmonyOS打造全场景新服务 应用设计相关资源: 开发相关资源: 例如开发工具 DevEco Studio 的下载 应用发布: 开发文档:

论文阅读《High-frequency Stereo Matching Network》

论文地址&#xff1a;https://openaccess.thecvf.com/content/CVPR2023/papers/Zhao_High-Frequency_Stereo_Matching_Network_CVPR_2023_paper.pdf 源码地址&#xff1a; https://github.com/David-Zhao-1997/High-frequency-Stereo-Matching-Network 概述 在立体匹配研究领域…

OpenAI承认GPT-4变懒,即将发布修复方案提升性能

目录 1OpenAI承认GPT-4变懒&#xff0c;即将发布修复方案提升性能 2一文秒懂人工智能全球近况 1OpenAI承认GPT-4变懒&#xff0c;即将发布修复方案提升性能 **划重点:** 1. &#x1f92f; 用户反馈:GPT-4使用者抱怨OpenAI破坏了体验&#xff0c;称模型几乎“害怕”提供答案。…

UE4 透明物体不渲染显示??

问题描述&#xff1a;半透明特效在背景&#xff08;半透明材质模型&#xff09;前&#xff0c;当半透明特效开始移动的时候&#xff0c;随着速度的加快会逐渐不渲染&#xff01; 解决办法&#xff1a; 1.设置透明度排序 2.如果还没效果&#xff0c;修改半透明背景模型以下材质…