c++STL之常用的算法

news2024/9/21 22:19:39

目录

常用的遍历算法

for_each()

transform()

for_each()和transform()算法比较 

常用的查找算法

adjacent_find()

binary_search

count()  

count_if()  

find()

常用的排序算法 

merge()

sort()

random_shuffle()

reverse()  

常用的拷贝算法和替换算法 

copy()

replace()和replace_if()

swap()

​编辑常用的算数和生成算法 

accumulate()

fill()


常用的遍历算法

for_each()

  • for_each:  用指定函数依次对指定范围内所有元素进行迭代访问。该函数不得修改序列中的元素。
class CMyShow
{
public:
	CMyShow()
	{
		num = 0;
	}
	void operator()(int &n)
	{
		num++;
		cout << n << " ";
	}
	void printNum()
	{
		cout << "num:" << num << endl;
	}
private:
	int num;
};
void main31_foreach()
{
	vector<int> v1;
	v1.push_back(1);
	v1.push_back(3);
	v1.push_back(5);

	printV(v1);
	cout << endl;

	//函数对象 回调函数入口地址
	for_each(v1.begin(), v1.end(), Showvector);
	cout << endl;
	
	for_each(v1.begin(), v1.end(), CMyShow());
	cout << endl;

	CMyShow mya;
	CMyShow my1 = for_each(v1.begin(), v1.end(), mya);
	my1.printNum();//mya和my1是两个不同的对象
	mya.printNum();
	cout << endl;

	my1 = for_each(v1.begin(), v1.end(), mya);
	my1.printNum();//mya和my1是两个不同的对象
	mya.printNum();
	cout << endl;
}

这边需要注意的是for_each函数的返回值和第三个形参是两个不同的对象

 

我们可以看到源码的第三个参数是值传递方式,所以与实参不是同一个对象。

transform()

  • transform:   与for_each类似,遍历所有元素,但可对容器的元素进行修改
  • transform()算法有两种形式: 
    • transform(b1, e1, b2, op) 
    • transform(b1, e1, b2, b3, op)
  • transform()的作用

例如:可以一个容器的元素,通过op,变换到另一个容器中(同一个容器中)

也可以把两个容器的元素,通过op,变换到另一个容器中

 

 

 

  • 注意: 1.如果目标与源相同,transform()就和for_each()一样

                   2.如果想以某值替换符合规则的元素,应使用replace()算法

void main32_transform()
{
	vector<int> v1;
	v1.push_back(1);
	v1.push_back(3);
	v1.push_back(5);

	printV(v1);
	cout << endl;
	
	//使用回调函数
	transform(v1.begin(), v1.end(), v1.begin(), increase);
	printV(v1);
	cout << endl;

	//使用预定义的函数对象
	transform(v1.begin(), v1.end(), v1.begin(), negate<int>());
	printV(v1);
	cout << endl;

	//使用函数适配器和函数对象
	list<int> mylist;
	mylist.resize(v1.size());
	transform(v1.begin(), v1.end(), mylist.begin(), bind2nd(multiplies<int>(), 10));
	printList(mylist);
	cout << endl;

	//transform也可以把运算结果直接输出到屏幕
	transform(v1.begin(), v1.end(), ostream_iterator<int>(cout, " "), negate<int>());
	cout << endl;
}

for_each()和transform()算法比较 

void showElem(int& n)
{
	cout << n << " ";
}
int showElem2(int n)
{
	cout << n << " ";
	return n;
}

void main43_transform_pk_foreach()
{
	vector<int> v1;
	v1.push_back(1);
	v1.push_back(3);
	v1.push_back(5);

	vector<int> v2 = v1;
	for_each(v1.begin(), v1.end(), showElem);
	cout << endl;

	transform(v2.begin(), v2.end(), v2.begin(), showElem2);
}

一般情况下:for_each所使用的函数对象,参数是引用,没有返回值 

transform所使用的函数对象,参数一般不使用引用,而是还有返回值

常用的查找算法

adjacent_find()

在iterator对标识元素范围内,查找一对相邻重复元素,找到则返回指向这对元素的第一个元素的迭代器。否则返回past-the-end。

void main44_adjacent_find()
{
	vector<int> v1;
	v1.push_back(1);
	v1.push_back(2);
	v1.push_back(2);
	v1.push_back(3);
	v1.push_back(5);

	vector<int>::iterator it = adjacent_find(v1.begin(), v1.end());
	if (it == v1.end())
	{
		cout << "没有找到重复的元素" << endl;
	}
	else
	{
		cout << *it << endl;
	}
	int index = distance(v1.begin(), it);
	cout << index << endl;
}

在有序序列中查找value,找到则返回true,即二分查找的方式。注意:在无序序列中,不可使用。

//二分法查找数据 1k=1024 10次
void main45_binary_search()
{
	vector<int> v1;
	v1.push_back(1);
	v1.push_back(3);
	v1.push_back(5);
	v1.push_back(7);
	v1.push_back(9);

	bool b = binary_search(v1.begin(), v1.end(), 7);
	if (b == true)
	{
		cout << "找到了" << endl;
	}
	else
	{
		cout << "没找到" << endl;
	}
}

count()  

利用等于操作符,把标志范围内的元素与输入值比较,返回相等的个数。

void main46_count()
{
	vector<int> v1;
	v1.push_back(1);
	v1.push_back(3);
	v1.push_back(5);
	v1.push_back(7);
	v1.push_back(7);
	v1.push_back(7);
	v1.push_back(9);

	int num = count(v1.begin(), v1.end(), 7);
	cout << num << endl;
}

 

count_if()  

 

bool GeatThree(int iNum)
{
	if (iNum > 3)
	{
		return true;
	}
	else
	{
		return false;
	}
}

void main47_countif()
{
	vector<int> v1;
	v1.push_back(1);
	v1.push_back(3);
	v1.push_back(5);
	v1.push_back(7);
	v1.push_back(7);
	v1.push_back(7);
	v1.push_back(9);

	int num = count_if(v1.begin(), v1.end(), GeatThree);
	cout << num << endl;
}

find()

  • find:  利用底层元素的等于操作符,对指定范围内的元素与输入值进行比较。当匹配时,结束搜索,返回该元素的迭代器。
void main48_find()
{
	vector<int> v1;
	v1.push_back(1);
	v1.push_back(3);
	v1.push_back(7);
	v1.push_back(5);
	v1.push_back(7);
	v1.push_back(7);
	v1.push_back(9);

	vector<int>::iterator it = find(v1.begin(), v1.end(), 5);
	cout << "*it:" << *it << endl;

	vector<int>::iterator it2 = find_if(v1.begin(), v1.end(), GeatThree);
	cout << "*it2:" << *it2 << endl;
}

 

常用的排序算法 

merge()

  • 以下是排序和通用算法:提供元素排序策略
  • merge:    合并两个有序序列,存放到另一个序列。

例如:vecIntA,vecIntB,vecIntC是用vector<int>声明的容器,vecIntA已包含1,3,5,7,9元素,vecIntB已包含2,4,6,8元素

vecIntC.resize(9);  //扩大容量

merge(vecIntA.begin(),vecIntA.end(),vecIntB.begin(),vecIntB.end(),vecIntC.begin());

此时vecIntC就存放了按顺序的1,2,3,4,5,6,7,8,9九个元素

void main_merge()
{
	vector<int> v1;
	v1.push_back(1);
	v1.push_back(3);
	v1.push_back(5);

	vector<int> v2;
	v2.push_back(2);
	v2.push_back(4);
	v2.push_back(6);

	vector<int> v3;
	v3.resize(v1.size() + v2.size());

	merge(v1.begin(), v1.end(), v2.begin(), v2.end(), v3.begin());
	
	printV(v3);
}

注意:这边的两个容器必须是有序的,否则程序会dump。

sort()

  • sort:  以默认升序的方式重新排列指定范围内的元素。若要改排序规则,可以输入比较函数。
class Student
{
public:
	Student(string name, int id)
	{
		m_name = name;
		m_id = id;
	}
	void prinT()
	{
		cout << "name:" << m_name << "id:" << m_id << endl;
	}
	string m_name;
	int m_id;
};

bool CompareS(Student& s1, Student& s2)
{
	return (s1.m_id < s2.m_id);
}

void main_sort()
{
	Student s1("老大", 1);
	Student s2("老二", 2);
	Student s3("老三", 3);
	Student s4("老四", 4);
	vector<Student> v1;
	v1.push_back(s4);
	v1.push_back(s1);
	v1.push_back(s3);
	v1.push_back(s2);

	for (vector<Student>::iterator it = v1.begin(); it != v1.end(); it++)
	{
		it->prinT();
	}
	sort(v1.begin(), v1.end(), CompareS);
	cout << "排序之后" << endl;
	for (vector<Student>::iterator it = v1.begin(); it != v1.end(); it++)
	{
		it->prinT();
	}
}

 

random_shuffle()

  • random_shuffle:     对指定范围内的元素随机调整次序。

srand(time(0)); //设置随机种子

void main_random_shuffle()
{
	vector<int> v1;
	v1.push_back(1);
	v1.push_back(3);
	v1.push_back(5);
	v1.push_back(7);

	random_shuffle(v1.begin(), v1.end());
	printV(v1);

	string str = "abcdefg";
	random_shuffle(str.begin(), str.end());
	cout << "str:" << str << endl;
}

reverse()  

翻转容器的元素或者字符串的元素

void main_reverse()
{
	vector<int> v1;
	v1.push_back(1);
	v1.push_back(3);
	v1.push_back(5);
	v1.push_back(7);

	reverse(v1.begin(), v1.end());
	printV(v1);
}

常用的拷贝算法和替换算法 

copy()

void main_copy()
{
	vector<int> v1;
	v1.push_back(1);
	v1.push_back(3);
	v1.push_back(5);
	v1.push_back(7);

	vector<int> v2;
	v2.resize(v1.size());

	copy(v1.begin(), v1.end(), v2.begin());
	printV(v2);
}

replace()和replace_if()

  • replace(beg,end,oldValue,newValue):    将指定范围内的所有等于oldValue的元素替换成newValue。
bool great_equal_5(int& n)
{
	if (n >= 5)
	{
		return true;
	}
	return false;
}

void main_replace_replaceif()
{
	vector<int> v1;
	v1.push_back(1);
	v1.push_back(3);
	v1.push_back(5);
	v1.push_back(7);
	v1.push_back(3);

	replace(v1.begin(), v1.end(), 3, 8);
	printV(v1);
	cout << endl;

	//>=5
	replace_if(v1.begin(), v1.end(), great_equal_5, 8);
	printV(v1);
}

swap()

  • swap:   交换两个容器的元素
void main_swap()
{
	vector<int> v1;
	v1.push_back(1);
	v1.push_back(3);
	v1.push_back(5);

	vector<int> v2;
	v2.push_back(2);
	v2.push_back(4);
	v2.push_back(6);

	swap(v1, v2);
	printV(v1);
}

常用的算数和生成算法 

accumulate()

  • accumulate:  对指定范围内的元素求和,然后结果再加上一个由val指定的初始值。
  • #include<numeric>
void main_accumulate()
{
	vector<int> v1;
	v1.push_back(1);
	v1.push_back(3);
	v1.push_back(5);

	int tmp = accumulate(v1.begin(), v1.end(), 100);
	cout << tmp << endl;
}

fill()

fill:   将输入值赋给标志范围内的所有元素

void main_fill()
{
	vector<int> v1;
	v1.push_back(1);
	v1.push_back(3);
	v1.push_back(5);

	fill(v1.begin(), v1.end(), 8);
	printV(v1);
}

 

 

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

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

相关文章

基于`IRIS`,动态解析`HL7`消息

文章目录 基于IRIS&#xff0c;动态解析HL7消息什么是HL7HL7 版本HL7 消息结构段&#xff08;Segment&#xff09;字段&#xff08;Field&#xff09; HL7 数据类型在IRIS中查看HL7数据结构传统方式拼写HL7消息结构动态对象解析HL7消息结构。 基于IRIS&#xff0c;动态解析HL7消…

SpringCloud:微服务保护之隔离和降级

1.FeignClient整合Sentinel SpringCloud中&#xff0c;微服务调用都是通过Feign来实现的&#xff0c;因此做客户端保护必须整合Feign和Sentinel。 1.1.修改配置&#xff0c;开启sentinel功能 修改OrderService的application.yml文件&#xff0c;开启Feign的Sentinel功能&…

详细版易学版TypeScript - 类

一、类 - 类的属性和方法 class MyPreson {// 类的属性// 属性需要在类里先定义并确定类型&#xff0c;才可以在constructor里面用this访问name: stringage: numberconstructor(name: string, age: number) {this.name name;this.age age;}// 类的方法sendStr(str: string) {…

工业4.0时代来临,POWERLINK协议在千兆网卡下的性能

“工业 4.0”的高歌猛进&#xff0c; “智能制造”&#xff0c;“智慧工厂”的呼声越来越响亮。这些需求使得数据传输量越来越大&#xff0c;实时性越来越高&#xff0c;因此我们将 POWERLINK 从 100Mbps 升级到1000Mbps。测试下POWERLINK这种工业总线协议的性能&#xff0c;最…

jest基础指示

describ&#xff08;类似java中的class&#xff0c;在这里定义的变量可以在所有it中使用&#xff09; 针对某一方面的测试&#xff0c;一个描述性的东西&#xff0c;针对某一个方面的测试&#xff0c;或者说是一个作用域 一组测试用例的集合。 有两个参数&#xff0c;参数1 &…

Vue 3.0 学习笔记

Vue 3 学习笔记 文章目录 Vue 3 学习笔记[toc]一、初识vue3二、 常用Composition API&#xff08;组合式API&#xff09;**1. setup函数****2. ref函数****3. reactive函数****4. Vue3.0中的响应式原理****Vue2.x的响应式****Vue3.x的响应式** **5. reactivce对比ref****6. set…

为什么我在大厂待了三个月就选择离开?我聊聊应届生该选择大厂还是小公司

我在互联网大厂只待了3个月就离开了&#xff0c;主要原因不是大厂的福利或者薪资不够好&#xff0c;只是因为我发现在大厂里每天都有开不完的会&#xff0c;忙碌到没有自己的生活。当时我每天10点上班&#xff0c;晚上要工作到11甚至是12点&#xff0c;甚至半夜两三点都接到过工…

LangChain-Agents 入门指南

LangChain-Agents 入门指南 LangChain-Agents 入门指南注册 Serpapi运行高级 Agents API 测试运行 Google Search其它 Here’s the table of contents: LangChain-Agents 入门指南 LangChain是一个使用LLMs构建应用程序的工具箱&#xff0c;包含Models、Prompts、Indexes、Mem…

Vue3-黑马(二)

目录&#xff1a; &#xff08;1&#xff09;vue3-ref与reactive &#xff08;2&#xff09;vue3-基础-属性绑定与事件绑定 &#xff08;3&#xff09;vue3-基础-表单绑定 &#xff08;1&#xff09;vue3-ref与reactive ref函数可以把普通的数据变成响应式的数据&#xff0…

Firewall Testing Checklist 分析

不管是在服务器、云技术、嵌入式、车载等场景&#xff0c;防火墙的作用尤为重要&#xff0c;下面从信息收集、管理审核流程、操作系统安全、已实现规则和检查配置&#xff0c;这五个方面来进行分析firewall的具体作用和能力&#xff0c;然后提供一些实用的网络firewall工具给大…

【Spring框架全系列】SpringBoot配置文件相关操作

&#x1f307;哈喽&#xff0c;大家好&#xff0c;我是小浪。上篇博客我们已经学习了如何创建一个Spring项目&#xff0c;那么创建Spirng项目还可以直接通过在Spring官网的方式来创建&#xff0c;做法也非常的简单&#xff0c;感兴趣的小伙伴可以在C站搜个教程尝试一下&#xf…

22年广东河南省赛-隐藏信息探索

任务十: 1、访问服务器的FTP服务,下载图片QR,从图片中获取flag,并将flag提交; QR.png的内容如下,可以看到,找到二维码的前三块都被反转了,需要反转回来,把这个二维码做成一个正方形,使用截图工具分隔、配合画图工具拼接+旋转。平均分为4块,分出4个方块。即可。 2、…

django 基本使用

django 下载 pip install -i https://pypi.tuna.tsinghua.edu.cn/simple django查看版本 django-admin --version 4.2.1创建项目 django-admin startproject project创建一个 app python manage.py startapp app注册 app project/settings # app名称.apps.app名称Config…

2023河南省赛vp题解

目录 A题&#xff1a; B题 C题 D题 E题 F题 G题 H题 I题 J题 K题 L题 A题&#xff1a; 1.思路&#xff1a;考虑暴力枚举和双hash&#xff0c;可以在O(n)做完。 2.代码实现&#xff1a; #include<bits/stdc.h> #define sz(x) (int) x.size() #define rep(i,z,…

头歌计算机算法设计与分析:随机化算法

第1关&#xff1a;硬币实验 任务描述 相关知识随机数 编程要求 测试说明任务描述 本关任务&#xff1a;计算机产生的伪随机数来模拟抛硬币试验。 相关知识 为了完成本关任务&#xff0c;你需要掌握&#xff1a;1.如何获取数组的长度&#xff0c;2.如何遍历数组。 随机数 随机…

基于 SpringBoot+WebSocket 无DB实现在线聊天室

0 项目说明 0.1 样例展示 0.2 源码地址 GitHub&#xff1a;https://github.com/ShiJieCloud/web-chat Gitee&#xff1a;https://gitee.com/suitbaby/web-chat GitCode&#xff1a;I’m Jie / web-chat GitCode 1 WebSocket 简介 1.1 HTTP 常用的 HTTP 协议是一种无状态…

【牛客刷题专栏】0x27:JZ29 顺时针打印矩阵(C语言编程题)

前言 个人推荐在牛客网刷题(点击可以跳转)&#xff0c;它登陆后会保存刷题记录进度&#xff0c;重新登录时写过的题目代码不会丢失。个人刷题练习系列专栏&#xff1a;个人CSDN牛客刷题专栏。 题目来自&#xff1a;牛客/题库 / 在线编程 / 剑指offer&#xff1a; 目录 前言问…

2023年Pycharm安装教程,附详细图解

简介 PyCharm是一款Python IDE&#xff0c;其带有一整套可以帮助用户在使用Python语言开发时提高其效率的工具&#xff0c;比如&#xff0c; 调试、语法高亮、Project管理、代码跳转、智能提示、自动完成、单元测试、版本控制等等。此外&#xff0c;该IDE提供了一些高级功能&a…

面向对象构造顺序与析构顺序详解

#include<bits/stdc.h> using namespace std;class animal{public:animal(){cout<<"调用animal构造"<<endl;}~animal(){cout<<"调用animal析构"<<endl;} };class verhical{public:verhical(){cout<<"调用verhica…

服装供应链管理包含哪些内容,如何选择服装供应链管理系统?

服装供应链管理是指对服装工厂的采购、生产、物流、仓储和销售等环节的管理&#xff0c;包括原材料的采购、成品的制造、配送、零售等多个环节。 选择合适的服装供应链管理系统&#xff0c;能够帮助服装工厂提高供应链管理的效率、优化库存管理、降低运营成本、保证服装生产的品…