探索C++非质变算法:如何更高效地处理数据

news/2024/11/25 9:37:15/

在这里插入图片描述

前言

📖欢迎大家来到小K的c++专栏,本节将为大家带来C++非质变算法的详解
🎉欢迎各位→点赞👏 + 收藏💞 + 留言🔔​
💬总结:希望你看完之后,能对你有所帮助,不足请指正!共同学习交流 🐾


文章目录

      • 前言
      • <algorithm>
        • 非质变算法(18个)
          • 1、all_of
          • 2、any_of
          • 3、none_of
          • 4、for_each
          • 5、find
          • 6、find_if
          • 7、find_if_not
          • 8、find_end
          • 9、find_first_of
          • 10、adjacent_find
          • 11、count
          • 12、count_if
          • 13、mismatch
          • 14、equal
          • 15、equal_range
          • 16、is_permutation
          • 17、search
          • 18、search_n


头文件定义了一个专门设计用于元素范围的函数集合。
范围是可以通过迭代器或指针访问的任何对象序列,例如数组或某些STL容器的实例。但是请注意,算法通过迭代器直接对值进行操作,不会以任何方式影响任何可能的容器的结构(它永远不会影响容器的大小或存储分配)

非质变算法(18个)

非质变算法:算法不会改变容器的数据。

1、all_of

区间[开始, 结束)中是否所有的元素都满足判断式p,所有的元素都满足条件返回true,否则返回false。

void test1() 
{vector<int> vec = { 1,3,5,7,9,11};if (all_of(vec.begin(), vec.end(), [](int n)->bool {return n % 2; })) {cout << "所有元素都是奇数" << endl;}
}
2、any_of

区间[开始, 结束)中是否至少有一个元素都满足判断式p,只要有一个元素满足条件就返回true,否则返回true

void test2()
{vector<int> vec = { 1,3,5,7,9,11,2 };if (any_of(vec.begin(), vec.end(), [](int n)->bool {return n % 2==0; })){cout << "存在偶数" << endl;}
}
3、none_of

区间[开始, 结束)中是否所有的元素都不满足判断式p,所有的元素都不满足条件返回true,否则返回false,all_of正好相反,所以只用换函数就可以了,不用换判断条件

void test3()
{vector<int> vec = { 2,4,6,8,10 };if (none_of(vec.begin(), vec.end(), [](int n)->bool {return n % 2; })){cout << "所有元素都不是奇数" << endl;}
}
4、for_each

将函数应用到范围,下面的例子是将Lambad表达式组成的打印函数应用到vec中,打印

void test()
{vector<int>  vec = { 1,3,5,7,9 };for_each(vec.begin(), vec.end(), [](int n) {cout << n << " "; });
}
5、find

在范围内搜索等于value的值

void test4()
{vector<int>  vec = { 1,3,5,7,9 };auto it = find(vec.begin(), vec.end(), 5);if (it != vec.end()){cout << "found it:" << *it << endl;}else{cout << "not found" << endl;}
}
6、find_if

根据指定的查找规则,在指定区域内查找第一个符合该函数要求(使函数返回 true)的元素.下面的例子返回3,因为第一个大于2的是3

void test()
{vector<int>  vec = { 1,3,5,7,9 };//查找第一个大于2的元素auto it = find_if(vec.begin(), vec.end(), [](int n) {return n > 2; });if (it != vec.end()){cout << "found it:" << *it << endl;}else{cout << "not found" << endl;}
}
7、find_if_not

查找范围内的元素,not表示否定,上面的例子,使用find_if_not就表示查找不大于2的元素(小于或等于2的元素)

void test6()
{vector<int>  vec = { 1,3,5,7,9 };//查找第一个小于等于2的元素auto it = find_if_not(vec.begin(), vec.end(), [](int n) {return n > 2; });if (it != vec.end()){cout << "found it:" << *it << endl;}else{cout << "not found" << endl;}
}
8、find_end
template <class _FwdIt1, class _FwdIt2
_FwdIt1 find_end(_FwdIt1 const _First1, const _FwdIt1 _Last1, const _FwdIt2 _First2, const _FwdIt2 _Last2)

在[first1,last1)范围内搜索由[first2,last2)定义的序列的最后一次出现,并返回指向其第一个元素的迭代器,如果没有出现,则返回指向last1的迭代器。

两个范围中的元素都使用操作符==(或在版本(2)中使用pred)进行顺序比较:只有当[first2,last2)的所有元素都为真时,才认为[first1,last1)的子序列是匹配的

在这里插入图片描述

9、find_first_of
template <class _FwdIt1, class _FwdIt2>
_FwdIt1 find_first_of(const _FwdIt1 _First1, const _FwdIt1 _Last1, const _FwdIt2 _First2,const _FwdIt2 _Last2)

返回一个迭代器,指向范围[first1,last1)中与[first2,last2)中的任何元素匹配的第一个元素。如果没有找到这样的元素,函数返回last1。

[first1,last1)中的元素使用操作符==(或在版本(2)中使用pred)与[first2,last2)中的每个值进行顺序比较,直到匹配为止。

void test()
{int arr[] = { 1,3,1,4,5,2,0 };int sub[] = { 5,3 };auto it = find_first_of(arr, arr + 7,sub,sub+2);if (it != arr + 7){cout << "在arr中找到与sub中匹配的元素" <<*it<< endl;}else{cout << "not found" << endl;}
}
10、adjacent_find

求范围内相等的相邻元素,在[first,last]范围内搜索匹配的两个连续元素的第一次出现,并返回指向这两个元素中的第一个的迭代器,如果没有找到这样的对,则返回指向最后一个的迭代器。

void test()
{int arr[] = { 1,3,3,4,5,2,0,6,6 };vector<int> vec(arr, arr + 9);auto it = adjacent_find(vec.begin(), vec.end());if (it != vec.end())cout << "第一对重复的元素是:" << *it << endl;it = adjacent_find(it + 1, vec.end(), [](int a, int b) {return a == b; });if (it != vec.end())cout << "第二对重复的元素是:" << *it << endl;
}
11、count

在范围内计算值的出现次数

void test()
{int arr[] = { 1,3,3,4,5,2,0,6,6 };vector<int> vec(arr, arr + 9);long long cnt = count(vec.begin(), vec.end(), 3);cout << "3出现次数:" << cnt << endl;
12、count_if

返回满足范围条件的元素个数

void test()
{int arr[] = { 1,3,3,4,5,2,0,6,6 };vector<int> vec(arr, arr + 9);long long 	//统计大于4的元素个数cnt = count_if(vec.begin(), vec.end(), [](int n) {return n > 4; });cout << "大于4的元素个数:" << cnt << endl;
}
13、mismatch

返回满足范围条件的元素个数,比较范围[first1,last1]中的元素与从first2开始的范围中的元素,并返回两个序列中第一个不匹配的元素。

在这里插入图片描述

14、equal

测试两个范围内的元素是否相等,比较元素个数为两个序列中最短的那个序列的元素个数。

在这里插入图片描述

15、equal_range

功能类似equal,返回一对iterator,第一个表示lower_bound,第二个表示upper_bound。

void test()
{vector<int> vec = { 10,20,30,30,20,10,10,20 };//必须先排序:因为equal_range使用了二分查找sort(vec.begin(), vec.end());auto mpair = equal_range(vec.begin(), vec.end(), 20);cout << *mpair.first << " " << *mpair.second << endl;
}
16、is_permutation

比较范围[first1,last1)中的元素与从first2开始的范围中的元素,如果两个范围中的所有元素都匹配,则返回true,即使顺序不同。

void test()
{vector<int> vec = { 1,2,3,4,5 };vector<int> vec1 = { 5,4,3,2,1 };if (is_permutation(vec.begin(), vec.end(), vec1.begin())){cout << "vec vec1两个是排列不同的相同序列" << endl;}
}
17、search

在[first1,last1)范围内搜索由[first2,last2)定义的序列的第一次出现,并返回指向其第一个元素的迭代器,如果没有找到第一次出现的元素,则返回指向last1的迭代器。

void test()
{vector<int> vec = { 1,2,88,3,4,5,9,7 };int ints[] = {4,5};auto it =  search(vec.begin(), vec.end(), ints, ints + 2);if (it != vec.end()){cout << "ints fount at pos:" << it - vec.begin() << endl;}
}
18、search_n

搜索范围[first,last)中元素的值为val的数量是否为count,每个元素的比较值都等于val(或pred返回true)。

该函数返回指向第一个此类元素的迭代器,如果没有找到此类序列则返回指向最后一个元素的迭代器。
在这里插入图片描述


http://www.ppmy.cn/news/97439.html

相关文章

提前布局

深圳最近的天气是美&#xff0c;有风&#xff0c;天空可以看得见飘来飘去的透明的云&#xff0c;傍晚时候也可以看见城市被霞光笼罩下那种很安静要睡去的样子&#xff0c;随处可以见到的青草绿叶和大树&#xff0c;从公司楼下穿过的一个小桥洞前看得见的红绿路牌也安静和谐。 今…

什么是ChatGPT、历史发展及应用领域

什么是ChatGPT ChatGPT是一种基于深度学习的自然语言处理技术&#xff0c;它可以生成高质量的自然语言文本&#xff0c;该技术是由OpenAI团队开发&#xff0c;旨在使计算机能够像人类一样理解和产生自然语言。ChatGPT使用了深度神经网络和自然语言处理技术&#xff0c;通过对大…

element-ui树形控件el-tree详解

概述 这里我利用element-ui开发一个vue的树形组件 引入element-ui 安装element-plus cnpm install element-plus --save 安装按需导入 cnpm install -D unplugin-vue-components unplugin-auto-import 修改vite.config.js配置按需加载 import AutoImport from unplugin-a…

English Learning - L3 综合练习 4 VOA-Food 2023.05.24 周三

English Learning - L3 综合练习 4 VOA-Food 2023.05.24 周三 句 1句 2Support 拓展养家&#xff0c;养家之人 句 3mustard 芥末expect 扩展 句 4句 5句 6句 7颁奖句 8句 9句 10句 11句 12句 13句 14好声音比赛 句 1 句 2 Support 拓展 Support 作动词时&#xff1a; Support …

医院PACS系统:三维多平面重建操作使用

三维多平面重建&#xff08;MPR\CPR&#xff09;界面工具栏&#xff1a; 按钮1&#xff1a;点击此按钮&#xff0c;用鼠标拖动正交的MPR定位线&#xff0c;可以动态浏览MPR图像。 按钮2&#xff1a;点击此按钮&#xff0c;按下鼠标左键在图像上作任意勾边&#xff0c;弹起鼠标…

ChatGPT在App Store累计下载量已突破50万次;Anthropic已成功完成4.5亿美元C轮融资

&#x1f680; OpenAI的ChatGPT应用在苹果App Store上线6天时间内&#xff0c;累计下载量已突破50万次。 OpenAI的ChatGPT应用在苹果App Store上线6天时间内&#xff0c;累计下载量已突破50万次。 与微软必应等聊天机器人相比&#xff0c;其热度远超过且持续上升。 &#x1…

c# cad二次开发实现注记搜索跟扩展属性搜索,并点击即可定位到位置,添加了界面操作

c# cad二次开发实现注记搜索跟扩展属性搜索&#xff0c;并点击即可定位到位置&#xff0c;添加了界面操作 在这里插入图片描述 using Autodesk.AutoCAD.DatabaseServices; using Autodesk.AutoCAD.EditorInput; using Autodesk.AutoCAD.Geometry; using System; using System.…

SpringCloud Alibaba 之 Config配置中心,Redis分布式锁详解

目录 1.服务配置中心 1.1 服务配置中心介绍 1.2 Nacos Config 实践 1.2.1 Nacos config 入门案例 1.2.2 Nacos 配置动态刷新 1.2.3 配置共享 1.2.4 nacos 几个概念 2.分布式锁 2.1 分布式锁介绍 2.2 Redisson 2.2.1 Redisson 实践 2.2.2 Redisson 原理 1.服务配置中心…