【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.pswp.cn/news/209775.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/209775.shtml
英文地址,請注明出處:http://en.pswp.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 運算符可以應用于數據類型或表達式。計算靜…