C++ 常用算法

限时加码!20+主流AI编程工具免费用 购周边加赠Coding Plan Lite,Claude Code、Cursor等即刻畅享,学习进阶更高效! 阅读详情

一、引言

        ※本文记录一些C++常用的算法,用于简单使用

  •      一般要使用C++的内置算法,需要包含以下三个头文件:

                #include<algorithm>#include<functional>#include<numeric>

头文件 解释
#include<algorithm>

        algorithm是STL头文件中最大的一个,

涉及:比较交换查找遍历修改复制等操作。

#include<functional> 定义了一些函数模板,用于仿函数
#include<numeric> 体积很小,仅仅包括几个在序列上进行简单数学运算函数模板

二、常用遍历算法

2.1 for_each

        for_each会遍历整个容器,它的使用方法如下所示:

声明 解释
for_each(iterator begin, iterator end, 仿函数函数);

(使用前,记得包含头文 #include<algorithm>)

  • 第一个参数和第二个参数均为迭代器,指的是遍历的区间。
  • 第三个参数指的是仿函数或者函数的名称,这个函数或者仿函数的参数应该是一个容器的元素类型,为每一个元素执行这个函数仿函数的行为。

        下面用一个小示例来具体说明如何使用for_each函数:

//函数
void printInt(int elem) {
	cout << elem << " ";
}

//仿函数
class PrintInt {
public:
	void operator()(int elem) const {
		cout << elem << " ";
	}
};

//主函数
int main() {
	vector<int> v0;
	for (int i = 0; i < 5; i++) {
		v0.push_back(i);
	}//v0 = 0 1 2 3 4

	//第三个参数为仿函数
	PrintInt print_int;
	cout << "第三个参数是仿函数:" << endl;
	for_each(v0.begin(), v0.end(), print_int);
	cout << endl;

	//第三个参数为函数
	cout << "第三个参数是函数:" << endl;
	for_each(v0.begin(), v0.end(), printInt);
	cout << endl;

	return 0;

}

        程序的执行结果如下所示:

2.2 transform

        transform会将一个容器的全部元素复制到另一个容器中,它的函数声明如下所示:

注意:在使用之前,一定要先让目标容器使用resize(源容器.size())先设置其容量!!

声明 解释

                    transform(iterator begin1,

              iterator end1,

                                      iterator begin2,

                                      仿函数函数);

(使用前,记得包含头文 #include<algorithm>)

  • 第一个参数和第二个参数均为源容器迭代器复制区间,也就是会将对begin开始到end的元素进行复制。
  • 第三个参数是目标容器开始迭代器,也就是将元素们begin2开始复制
  • 第四个参数指的是仿函数或者函数的名称,它的作用是:在复制到目标容器前,可以对元素进行某种计算或者处理,之后再将处理后的值填入目标容器。(当前,也可以什么都不做)

         下面用一个小示例来具体说明如何使用transform函数:

//输出函数
void printInt(int elem) {
	cout << elem << " ";
}

//函数:值+1
int  changeInt(int elem) {
	elem++;

	return elem;
}

//仿函数:值-1
class ChangeInt {
public:
	int operator()(int i) {
		i--;

		return i;
	}
};

int main() {
	vector<int> v0;//源容器
	vector<int> v1;//目标容器:第四个参数使用函数
	vector<int> v2;//目标容器:第四个参数使用仿函数
	for (int i = 0; i < 5; i++) {
		v0.push_back(i);
	}//v0 = 0 1 2 3 4

	//输出v0
	cout << "v0 : [";
	for_each(v0.begin(), v0.end(), printInt);
	cout << "]" << endl;
	//输出v1
	cout << "v1 : [";
	for_each(v1.begin(), v1.end(), printInt);
	cout << "]" << endl;
	//输出v2
	cout << "v2 : [";
	for_each(v2.begin(), v2.end(), printInt);
	cout << "]" << endl;

	//使用transform函数:第四个参数使用函数
	v1.resize(v0.size());
	transform(v0.begin(), v0.end(), v1.begin(), changeInt);

	//使用transform函数:第四个参数使用仿函数
	v2.resize(v0.size());
	ChangeInt change;
	transform(v0.begin(), v0.end(), v2.begin(), change);

	//输出v0
	cout << "v0 : [";
	for_each(v0.begin(), v0.end(), printInt);
	cout << "]" << endl;
	//输出v1
	cout << "v1 : [";
	for_each(v1.begin(), v1.end(), printInt);
	cout << "]" << endl;
	//输出v2
	cout << "v2 : [";
	for_each(v2.begin(), v2.end(), printInt);
	cout << "]" << endl;

    return 0;
}

        以上例子,将第四个参数设置为函数,将v0的每个值+1后,搬运给v1

                        将第四个参数设置为仿函数,将v0的每个值-1后,搬运给v2,程序执行结果如下:

三、常用查找算法

3.0 注意

        针对自定义类型的查找算法:在比较过程中,其实程序并不知道如何比较两个元素是否相等,也就是没有对应的==运算符。因此,我们需要在自定义类中重载==运算符

                     (下文中只在findfind_if中做示例说明,此外的其余函数均同理)

       ※  binary_search只能用于有序序列

3.1 find

        find用于查找容器中的指定元素。

如果找到,则返回元素的迭代器;如果没找到,则返回本容器的结束迭代器end()。声明如下:

声明 解释
find(iterator begin, iterator end, value);

(使用前,记得包含头文 #include<algorithm>)

  • 第一个参数和第二个参数均为迭代器,指的是遍历的区间。
  • 第三个参数为想要查找元素的值

3.1.1 内置类型元素的find

vector<int> v0;
for (int i = 0; i < 10; i++) {
	v0.push_back(i);
}//v0 = 0 1 2 3 4 5 6 7 8 9

vector<int>::iterator it4 = find(v0.begin(), v0.end(), 4);
cout << "find 4 : " << boolalpha << (*it4 == 4) << endl;

vector<int>::iterator it11 = find(v0.begin(), v0.end(), 11);
cout << "find 11 : " << boolalpha << (*it4 == 11) << endl;

        程序的执行结果如下所示:

3.1.2 自定义类型元素的find

        当我们需要查找的是自定义类型的元素时,在比较过程中,其实程序并不知道如何比较两个元素是否相等,也就是没有对应的==运算符。因此,我们需要在自定义类中重载==运算符

//Person类
class Person {
	public:
		string name;
		int age;

		Person(string n, int a) : name(n), age(a){}

		//重载==运算符
		bool operator==(const Person &p) {
			
			return (this->name == p.name) && (this->age == p.age);
		}
};

//主函数
int main() {
	vector<Person> vp;

	Person p1("A", 18);
	vp.push_back(p1);
	Person p2("B", 18);
	vp.push_back(p2);
	Person p3("C", 18);
	vp.push_back(p3);
	Person p4("D", 18);
	vp.push_back(p4);
	Person p5("E", 18);
	vp.push_back(p5);

	//能找到的C
	Person p_find("C", 18);
	vector<Person>::iterator itp = find(vp.begin(), vp.end(), p_find)
你需要的c++常用算法合集,都在这里(一) 因为c++算法太多,所以将他分成两篇文章去写,这篇文章主要涉及遍历,查找和排序算法 1、遍历算法 (1)for_each 函数原型 for_each(iterator beg, iterator end ,_func); 遍历算法遍历容器元素 beg开始迭代器 end 结束迭代器 func 函数或者函数对象 具体运用如下 在这里插入代码片 ... 阅读详情

相关推荐

C++ STL 常用算法

标准库定义了一组泛型算法:因为它们实现共同的操作,所以称之为“算法”;而“泛型”指的是它们可以操作在多种容器类型上——不但 可作用于 vector 或 list 这些标准库类型,还可用在内置数组类型、甚至其他类型的序列上。大多数算法是通过遍历由两个迭代器标记 的一段元素来实现其功能。算法通过迭代器访问元素,这些迭代器标记了要遍历的元素范围。 使用泛型算法必须包含 algorithm 头文件:

summer 6423

C++经典排序算法总结

转发请注明出处:https://www.cnblogs.com/fnlingnzb-learner/p/9374732.html  最近在研究一些经常用到的东西想把它们做一个汇总,想了想用到最多的应该是排序算法,所以对排序算法做了个总结,并自己用C++实现了一下。 一、算法概述 0.1 算法分类 十种常见排序算法可以分为两大类: 非线性时间比较类排序:通过比较来决定元素间的相对次序,由于其时间复...

weixin_34175509的博客 1247

C++算法竞赛入门常用知识点

C++算法竞赛入门常用知识点

无限进步 1239

c++常见算法

find 查找自定义数据类型 需要重载==private:int num;public:Person(){}//find 查找自定义数据类型 需要重载==if(ret!cout

qq_51691366的博客 6744

C++算法之——常用算法总结

基本的C++算法分为三类:排序算法、树算法、图算法 算法思想有三种:递推、分治、动态规划 以及 贪心算法。 本文将简要介绍上面三类算法,介绍时穿插介绍算法思想。 一、排序算法 1、基本O(n^2)排序算法: (对基本排序算法的时间复杂度分析主要考虑 比较次数、数据交换次数) 冒泡排序:针对数组、本地排序、需要交换数据。O(1)额外空间 选择排序:一般针对数组、本...

dizhi5320的博客 1879

C++常用算法

将介绍一些同排序和合并松散关联的算法。STL算法部分主要由头文件组成。要使用 STL中的算法函数必须包含头文件,对于数值算法须包含中则定义了一些模板类,用来声明函数对象。提示:以下是本篇文章正文内容,下面案例可供参考例如:以上就是今天要讲的内容,本文仅仅简单介绍了pandas的使用,而pandas提供了大量能使我们快速便捷地处理数据的函数和方法。

ZGP1234的博客 1924

c++常用算法

作用:遍历迭代器,每一次都执行一遍函数。

AGreenRegiment的博客 2122

C++常用算法

find //查找元素find_if //按条件查找元素adjacent_find //查找相邻重复元素binary_search //二分查找法count //统计元素个数count_if //按条件统计元素个数。

Blue_2018的博客 843

STL常用算法——C++

方式一:传入普通函数(printf1) 方式2:利用仿函数,传入匿名函数对象 注意:函数只需要传入函数名就行,但是仿函数需要传入函数对象。for_each在实际开发中是最常用的一个算法,需要熟练掌握 注意:转运之前,需要将目标对象用resize()也开辟相同的空间。 注意:find的返回值是迭代器 底层原理就是二分查找,二分查找需要提前排序好才能用,二分查找需要的算力少。 如果是无序序列,结果未知 总结:对于统计自定义数据类型的时候,需要配合重载operator==

2401_84315007的博客 2392

C++常用通用算法

C++通用算法

qq_41920323的博客 1958

C++中各类常用算法的总结以及使用

本文总结介绍了C++常用算法合集,通过了解和使用这些算法,将大幅提高编程效率。

weixin_73497355的博客 3077

c++ stl常用算法

c++常用算法用法

hutaotaotao的博客 1158

C++常用算法有哪些?

/ 输出: First match: 3。

Ailunwengo的博客 1571

C++ 算法竞赛的常用库函数

C++ 算法竞赛的常用库函数 算法竞赛赛前复习必备

Yvonne_78的博客 5510

c++常用算法 algorithm

for_each\transform\find\find_if\adjacent_find\binary_search\count\count_if\ sort\\random_shuffle\merge\reverse\copy\replace\replace_if\swap\accumulate\fill\set_intersection\set_union\set_difference

喜欢分享工作中遇到的Bug和技术 1244

6 c++提高——STL常用算法

【代码】6 c++提高——STL常用算法

xcxhzjl的博客 1215

STL常用算法---C++

概述算法主要是由头文件<numeric>组成。是所有STL头文件中最大的一个,范围涉及到比较、 交换、查找、遍历操作、复制、修改等等;<numeric>体积很小,只包括几个在序列上面进行简单数学运算的模板函数;定义了一些模板类,用以声明函数对象。

weixin_63685622的博客 1091

算法常用库函数——C++

本文主要记录、整理、回顾在算法考试中常用的一些库函数,技巧等,不断更新中~

weixin_45857030的博客 1962

C++ STL 之 常用算法

#include <iostream> #include <vector> #include <algorithm> using namespace std; // transform 将一个容器的元素 搬运 到另一个容器中 struct MyPlus { int operator()(int val) { ...

weixin_30588729的博客 153
上一篇: C++ 谓词
下一篇: 算法 定长按组翻转链表
陆地鲨鱼-彻
博客等级 码龄9年 671粉丝 104原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值