【C++】算法库(批量操作、搜索操作)

C++算法库

文章目录

  • C++算法库
    • 批量操作
      • for_each
      • for_each_n
    • 搜索操作
      • all_of ,any_of ,none_of
      • find, find_if, find_if_not
      • find_end
      • std::find_first_of
      • adjacent_find
      • count, count_if
      • equal
      • search
      • search_n

算法库提供大量用途的函数(例如查找、排序、计数、操作),它们在元素范围上操作。

》》概念约束
》》ranges标准库

C++20 在命名空间 std::ranges 中提供大多数算法的受约束版本,在这些算法中,范围既可以由迭代器-哨位对,也可以由单个 range 实参指定,还支持投影和成员指针可调用对象。

std::vector<int> v {7, 1, 4, 0, -1};
std::ranges::sort(v); // 受约束算法
  • 头文件
#include <algorithm>
#include <numeric> 
#include <memory>
#include <ranges> //C++20

批量操作

for_each

应用函数到范围中的元素

std::vector<int> v {3, -4, 2, -8, 15, 267};auto print = [](const int& n) { std::cout << n << ' '; };std::for_each(v.cbegin(), v.cend(), print);//3 -4 2 -8 15 267 
std::for_each(v.begin(), v.end(), [](int &n){ n++; });
std::for_each(v.cbegin(), v.cend(), print);//4 -3 3 -7 16 268 
  • 应用ranges
std::vector<int> nums{3, 4, 2, 8, 15, 267};auto print = [](const auto& n) { std::cout << ' ' << n; };std::ranges::for_each(std::as_const(nums), print);//3 4 2 8 15 267
std::ranges::for_each(nums, [](int &n){ n++; });
std::ranges::for_each(std::as_const(nums), print);// 4 5 3 9 16 268

for_each_n

应用一个函数对象到序列的前 n 个元素

std::vector<int> v {3, -4, 2, -8, 15, 267};
std::for_each_n(v.begin(), 3, [](int &n){ n++; });
//4 -3 3 -8 15 267
  • ranges
std::vector<int> nums{3, 4, 2, 8, 15, 267};
std::ranges::for_each_n(nums.begin(), 3, [](int &n){ n++; });
//4 5 3 8 15 267

搜索操作

all_of ,any_of ,none_of

检查谓词是否对范围中所有、任一或无元素为 true

  • all_of 所有是否满足条件
  • any_of 至少有一个满足
  • none_of 没有一个满足
std::vector<int> v2 {10 , 2};
if (std::all_of(v2.begin(), v2.end(), [](int i) { return i % 2 == 0; }))std::cout << "All numbers are even\n"; //true
if (std::none_of(v2.begin(), v2.end(), [](int i) { return i % 2 == 0; }))std::cout << "None of them are odd\n"; //false
if (std::any_of(v2.begin(), v2.end(), [](int i) { return i % 2 == 0; }))std::cout << "At least one number is odd\n"; //true
  • ranges
std::vector<int> v2 {10 , 2};
if (std::ranges::all_of(v2, [](int i) { return i % 2 == 0; }))std::cout << "All numbers are even\n"; //true
if (std::ranges::none_of(v2, [](int i) { return i % 2 == 0; }))std::cout << "None of them are odd\n"; //false
if (std::ranges::any_of(v2, [](int i) { return i % 2 == 0; }))std::cout << "At least one number is odd\n"; //true

find, find_if, find_if_not

寻找首个满足特定判别标准的元素

  • find 寻找首个为x的元素
  • find_if 寻找首个为true的元素
  • find_if 寻找首个为false的元素

std::distance(v.begin(), x)返回出现位置

std::vector<int> v {3, -4, 2, -8, 15, 267};
auto x = std::find(v.begin(),v.end(),3);
if(x != v.end())std::cout << "v 包含" << std::distance(v.begin(), x); // 0
auto y = std::find_if(v.begin(),v.end(), [](int i) { return i % 2 == 0; });
if(y != v.end())std::cout << "v " << std::distance(v.begin(), y); // 1
auto z = std::find_if_not(v.begin(),v.end(), [](int i) { return i % 2 == 0; });
if(z != v.end())std::cout << "v " << std::distance(v.begin(), z); // 0
  • ranges
std::vector<int> v {3, -4, 2, -8, 15, 267};
auto x = std::ranges::find(v,3);
if(x != v.end())std::cout << "v 包含" << std::distance(v.begin(), x); // 0
auto y = std::ranges::find_if(v, [](int i) { return i % 2 == 0; });
if(y != v.end())std::cout << "v " << std::distance(v.begin(), y); // 1
auto z = std::ranges::find_if_not(v, [](int i) { return i % 2 == 0; });
if(z != v.end())std::cout << "v " << std::distance(v.begin(), z); // 0

find_end

在特定范围中寻找最后出现的元素序列

    std::vector<int> v {1,2,3,1,2,3,4,5,6};vector<vector<int>> v2 = {{1, 2, 3}, {3, 4, 5}};for(auto x : v2){auto t = std::find_end(v.begin(), v.end(), x.begin() , x.end());std::cout << std::distance(v.begin(), t);//3 5}

std::find_first_of

在范围 [first, last) 中搜索范围 [s_first, s_last) 中的任何元素

    std::vector<int> v {1,2,3,1,2,3,4,5,6};vector<vector<int>> v2 = {{1, 2, 3}, {3, 4, 5}};for(auto x : v2){auto t = std::find_first_of(v.begin(), v.end(), x.begin() , x.end());std::cout << std::distance(v.begin(), t);//0 2}

adjacent_find

查找首对相邻的相同(或满足给定谓词的)元素

std::vector<int> v1{0, 1, 2, 3, 40, 40, 41, 41, 5};
auto i1 = std::adjacent_find(v1.begin(), v1.end());
if (i1 == v1.end())std::cout << "没有匹配的相邻元素\n";
elsestd::cout << "第一对相等的相邻元素位于 "<< std::distance(v1.begin(), i1) << ",*i1 = "<< *i1 << '\n';

count, count_if

  • count x个数
  • count_if 满足表达式为true的个数
std::vector<int> v = {1, 2, 3, 4, 4, 3, 7, 8, 9, 10};
std::cout << std::count(v.begin(),v.end(),3);//2
std::cout << std::count_if(v.begin(),v.end(),[](int i) { return i % 2 == 0; });//偶数个数 5
string s = "aabbbbcccccccc";
std::cout << std::count(s.begin(),s.end(),'c');//8
  • ranges
std::vector<int> v = {1, 2, 3, 4, 4, 3, 7, 8, 9, 10};
std::cout << std::ranges::count(v,3);//2
std::cout << std::ranges::count_if(v,[](int i) { return i % 2 == 0; });//偶数个数 5
string s = "aabbbbcccccccc";
std::cout << std::ranges::count(s,'c');//8

equal

确定两个元素集合是否是相同的

string a = "xyz";
string b = "xyz";
if(std::equal(a.begin(),a.end(),b.begin(),b.end()))std::cout << "equal";
  • ranges
string a = "xyz";
string b = "xyz";
if(std::ranges::equal(a,b))std::cout << "equal";

search

搜索范围 [first, last) 中首次出现元素序列 [s_first, s_last) 的位置。

string str = "ddccabcabcabc";
string words = "abc";
auto it = std::search(str.begin(),str.end(),words.begin(),words.end());
std::cout << std::distance(str.begin() , it);//4

search_n

在范围中搜索一定量的某个元素的连续副本
在范围 [first, last) 中搜索 count 个等同元素的序列,每个都等于给定的值 value

string str = "1001010100010101001010101";
auto it = std::search_n(str.begin() , str.end() , 3 , '0');
std::cout << std::distance(str.begin() , it); //第一次出现连续的三个零的位置:8

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

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

相关文章

微信小程序 - PC端选择ZIP文件

微信小程序 - PC端选择文件 分享代码片段场景分析解决思路附魔脚本chooseMediaZip 选择附魔后的ZIP文件相关方法测试方法 参考资料 分享代码片段 不想听废话的&#xff0c;直接看代码。 https://developers.weixin.qq.com/s/UL9aojmn7iNU 场景分析 如果你的微信小程序需要选…

TypeScript入门实战笔记 -- 开篇 为什么要选择 TypeScript ?

typescript 在线编辑器http://typescript.p2hp.com/play?#code/JYOwLgpgTgZghgYwgAgJIFUDO1Uhge2QG8AoZc5YAEwC5kQBXAWwCNoBuMikOJiOzGCigA5pwrI4ANzhg4UAPwChozgF8SmmAxAIwwfCGRYcefAAoADlHyXMdDNii4CASmJdyCQ5nwAbCAA6P3wRKxs7ABpkAHJrW0wY1xINEhNnM3MiSlpkAEZonj46GIBrROQ1…

openEuler学习05-kernel升级

周末没事&#xff0c;尝试下openEuler的kernel升级 [rootlocalhost ~]# more /etc/os-release NAME"openEuler" VERSION"20.03 (LTS-SP3)" ID"openEuler" VERSION_ID"20.03" PRETTY_NAME"openEuler 20.03 (LTS-SP3)" ANSI_…

营收增速持续放缓,博通CEO期待AI崛起救场 | 百能云芯

博通作为苹果等大型科技公司的芯片供应商&#xff0c;于周四发布了财报。尽管截至10月29日的第四季度营收增长了4%至93亿美元&#xff0c;符合市场预期&#xff0c;但增速已经降至2020年以来的最低水平。 由于企业客户和电信供应商在控制支出方面的谨慎态度&#xff0c;博通的销…

IDEA构建springBoot新项目时JDK只有17和21,无法选择JDK8解决方案

今天创建springboot新项目时&#xff0c;发现IDEA里JDK选项只有17和21&#xff0c;无法选择本机的JDK8&#xff0c;网上查资料后发现是springboot2.7于11.24号后停止维护&#xff0c;基于2.7和java8的spring Initializ官方不再维护&#xff0c;解决方案是在server URL栏&#x…

东北大学Python

目前金属矿开采&#xff0c;爆破还是主要的破岩方式&#xff0c;为了保证巷道采场的安全&#xff0c;需要对爆破震动进行监测&#xff0c;获取的监测数据如附件&#xff0c;第1列数据为震动的序号&#xff0c;第2、3、4列为x,y,z三个方向的震动速度&#xff0c;往往由于各种因素…

C++ 运算符重载与操作符重载

目录 运算符重载 运算符重载的特性 其他运算符重载的实现 默认成员函数——赋值运算符重载 默认成员函数——取地址操作符重载 const成员 附录 运算符重载 C为了增强代码的可读性引入了运算符重载&#xff0c;运算符重载是具有特殊函数名的函数&#xff0c;也具有其返回…

使用Vue实现一个当鼠标悬浮时出现,鼠标离开时消失的双层菜单

前言 分享一个基于Vue实现一个当鼠标悬浮时出现&#xff0c;鼠标离开时消失的双层菜单。同时也是为了以后需要类似的需求时&#xff0c;可以提供一个实现思路&#xff0c;以及可以快速ctrlc和ctrlv操作&#xff0c;提高工作效率~ 一、示例代码 &#xff08;1&#xff09;/sr…

Linux C/C++ 分析网络流量(十六进制TCP数据包分析)

在分析TCP数据包时&#xff0c;理解TCP协议的工作原理和报文格式是关键。TCP是一种面向连接的、提供可靠的、端到端的字节流传输服务。其头部结构包括源端口、目标端口、序列号、确认应答号等字段。序列号是在建立连接时由计算机生成的随机数作为初始值&#xff0c;每发送一次数…

使用Pytorch从零开始实现BERT

生成式建模知识回顾: [1] 生成式建模概述 [2] Transformer I&#xff0c;Transformer II [3] 变分自编码器 [4] 生成对抗网络&#xff0c;高级生成对抗网络 I&#xff0c;高级生成对抗网络 II [5] 自回归模型 [6] 归一化流模型 [7] 基于能量的模型 [8] 扩散模型 I, 扩散模型 II…

前端食堂技术周刊第 107 期:技术播客节、Deno Cron、FEDAY、XState v5、Electron 2023 生态系统回顾

美味值&#xff1a;&#x1f31f;&#x1f31f;&#x1f31f;&#x1f31f;&#x1f31f; 口味&#xff1a;烤椰拿铁 食堂技术周刊仓库地址&#xff1a;https://github.com/Geekhyt/weekly 大家好&#xff0c;我是童欧巴。欢迎来到前端食堂技术周刊&#xff0c;我们先来看下…

图论与网络优化3

CSDN 有字数限制&#xff0c;因此笔记分别发布&#xff0c;目前&#xff1a; 【笔记1】概念与计算、树及其算法【笔记2】容量网络模型、遍历性及其算法【笔记3】独立集及其算法 6 独立集及其算法 6.1 独立集和覆盖 6.1.1 独立数和覆盖数 独立集&#xff1a;设 S ⊆ V ( G …

PaddleDetection系列2--NCCL安装及测试

NCCL安装及测试 1 系统信息查看1.1 查看本机的操作系统和位数信息&#xff1a;1.2 确认处理器架构1.3 确认cuda版本 2 NCCL安装2.1 根据上面的系统架构以及CUDA版本&#xff0c;进入[官网](https://developer.nvidia.com/nccl/nccl-download)下载匹配的nccl&#xff0c;若想获取…

力扣44题通配符匹配题解

44. 通配符匹配 - 力扣&#xff08;LeetCode&#xff09; 给你一个输入字符串 (s) 和一个字符模式 (p) &#xff0c;请你实现一个支持 ? 和 * 匹配规则的通配符匹配&#xff1a; ? 可以匹配任何单个字符。* 可以匹配任意字符序列&#xff08;包括空字符序列&#xff09;。 …

【ITK库学习】使用itk库进行图像滤波ImageFilter:梯度Gradient

目录 1、itkGradientImageFilter2、itkGradientMagnitudeImageFilter 梯度强度3、itkGradientMagnitudeRecursiveGaussianImageFilter 带滤波的梯度强度4、itkDerivativeImageFilter 不带滤波的导函数 1、itkGradientImageFilter 该类是一个基类&#xff0c;用于使用方向导数计…

C++笔试题之回文数的判断

“回文”是指正读反读都能读通的句子&#xff0c;它是古今中外都有的一种修辞方式和文字游戏&#xff0c;如“我为人人&#xff0c;人人为我”等。在数学中也有这样一类数字有这样的特征&#xff0c;成为回文数&#xff08;palindrome number&#xff09;。 设n是一任意自然数…

MSSQL 程序集使用方法

1.C# 写一个程序 1.1新建一个项目【类库【.Net FrameWork】 1.2编写代码 删除 namespace ApiSQLClass { } 代码如下&#xff1a;【具体调用API模式根据具体编写】 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.…

1. 使用poll或epoll创建echo服务器

1. 说明&#xff1a; 此篇博客主要记录一种客户端实现方式&#xff0c;和两种使用poll或者epoll分别创建echo服务器的方式&#xff0c;具体可看代码注释&#xff1a; 2. 相关代码&#xff1a; 2.1 echoClient.cpp #include <iostream> #include <cstdio> #incl…

C语言中的 sizeof 运算符

在 C 语言中&#xff0c;sizeof 是一个运算符&#xff0c;用于获取给定类型或变量的字节大小。它返回一个 size_t 类型的值&#xff0c;表示以字节为单位的对象大小。 sizeof 运算符有以下特点&#xff1a; 用法&#xff1a;sizeof 运算符可以应用于数据类型或表达式。计算静…