【C++】算法庫(復制操作、交換操作、變換操作)

C++算法庫

文章目錄

  • C++算法庫
    • 復制操作
      • copy , copy_if
      • copy_n
      • copy_backward
    • 交換操作
      • swap
      • swap_ranges
      • iter_swap
    • 變換操作
      • transform
      • replace
      • replace_copy replace_copy_if

算法庫提供大量用途的函數(例如查找、排序、計數、操作),它們在元素范圍上操作。

》》概念約束
》》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

復制操作

copy , copy_if

  • copy 復制范圍 [first, last) 中的元素到從 d_first 開始的另一范圍(復制目標范圍)
  • copy_if 對對所要求的元素則返回 ?true 的一元謂詞執行copy

first, last —要復制的元素范圍
d_first — 目標范圍的起始

vector<int> a = {1,2,3,4,5};
vector<int> b(10);
std::copy(a.begin() , a.end() , b.begin());
for(auto x : b)std::cout << x << " "; //1 2 3 4 5 0 0 0 0 0
//std::back_inserter用于動態獲取b.end()位置插入
std::copy_if(a.begin() , a.end() , std::back_inserter(b), [](int x){return x % 2 == 0;});
for(auto x : b)std::cout << x << " ";//1 2 3 4 5 0 0 0 0 0 2 4 
  • ranges
std::ranges::copy(a , b.begin());
std::ranges::copy_if(a , b.begin(), [](int x){return x % 2 == 0;});

copy_n

復制始于 first 的范圍中恰好 count 個值到始于 result 的范圍。

first — 復制來源的元素范圍起始
count — 要復制的元素數
result — 目標范圍起始

std::string in {"1234567890"};
std::string out;
std::copy_n(in.begin(), 4, std::back_inserter(out));//1234
std::cout << out << '\n';
  • ranges
std::ranges::copy_n(in.begin(), 4, std::back_inserter(out));//1234

copy_backward

(按從后往前的順序復制一個范圍內的元素)
將范圍 [first, last) 內的元素復制到終于 d_last 的范圍。以逆序復制元素(首先復制末元素),但保持相對順序。

first, last — 要復制的元素范圍
d_last — 目標范圍的結尾

std::vector<int> source = {1,2,3,4,5};
std::vector<int> destination(6);
std::copy_backward(source.begin(), source.end(), destination.end());
for(auto x : destination)std::cout << x << " ";//0 1 2 3 4 5
  • ranges
std::ranges::copy_backward(source, destination.end());

交換操作

swap

交換兩個對象的值

vector<int> a = {1,2,3,4,5};
vector<int> b = {5,4,3,2,1};
std::swap(a, b);
for(auto x : a)cout << x << " ";//5 4 3 2 1
for(auto x : b)cout << x << " ";//1 2 3 4 5

swap_ranges

交換兩個范圍的元素
在范圍 [first1, last1) 和始于 first2 的另一范圍間交換元素。

first1, last1 — 要交換的第一個元素范圍
first2 — 要交換的第二個元素范圍的起始

std::vector<char> v{'a', 'b', 'c', 'd', 'e'};
std::list<char> l{'1', '2', '3', '4', '5'};
std::swap_ranges(v.begin(), v.begin() + 3, l.begin());
for(auto x : l)cout << x << " "; //a b c 4 5
  • ranges

在第一范圍 [first1, first1 + M) 與第二范圍 [first2, first2 + M) 交換

std::vector<char> v{'a', 'b', 'c', 'd', 'e' , 'f' ,'g' , 'h'};
std::ranges::swap_ranges(v.begin(), v.begin() + 2, v.begin() + 4 , v.begin() + 6);
for(auto x : v)cout << x << " "; //e f c d a b g h

iter_swap

交換兩個迭代器所指向的元素

vector<int> a = {1,2,3,4,5};
vector<int> b = {5,4,3,2,1};
std::iter_swap(a.begin() , b.begin());
std::cout << a[0] << " " << b[0] << std::endl;//5 1

變換操作

transform

將一個函數應用于某一范圍的各個元素,并在目標范圍存儲結果
應用一元函數 unary_op[first1, last1) 所定義的范圍
應用二元函數 binary_op 到來自兩個范圍的元素對:一個以 [first1, last1) 定義,而另一個始于 first2

std::string s{"hello"};
std::transform(s.begin(), s.end(),s.begin(), // 寫入相同位置[](unsigned char c) { return std::toupper(c); });
std::cout << s << '\n'; //HELLOvector<int> ordinals = {1,2,3,4,5};
std::transform(ordinals.cbegin(), ordinals.cend(), ordinals.cbegin(),ordinals.begin(), [](int a , int b){return a + b;});
for(auto x : ordinals)cout << x << " ";//2 4 6 8 10
  • ranges
    std::ranges::transform(s,s.begin(), // 寫入相同位置[](unsigned char c) { return std::toupper(c); });std::ranges::transform(ordinals , ordinals, ordinals.begin(), [](int a , int b){return a + b;});

replace

將所有滿足特定判別標準的值替換為另一個值
new_value 替換范圍 [first, last) 中所有滿足特定判別標準的元素。

vector<int> a = {1,2,3,2,5};
//所有為2的值替換為88
std::replace(a.begin(), a.end(), 2, 88);
for(auto x : a)cout << x << " ";// 1 88 3 88 5
  • ranges
std::ranges::replace(a, 2, 88);

replace_copy replace_copy_if

復制一個范圍,并將滿足特定判別標準的元素替換為另一個值
復制來自范圍 [first, last) 的元素到始于 d_first 的范圍,復制過程中以 new_value 替換所有滿足特定判別標準的元素。

std::vector<int> v{1,1,1,2,3,4};
std::replace_copy(v.begin(), v.end(),v.begin(),1, 99);
for(auto x : v)cout << x << " ";//99 99 99 2 3 4
std::vector<int> v{5, 7, 4, 2, 8, 6, 1, 9, 0, 3};
std::replace_copy_if(v.begin(), v.end(),v.begin(),//輸出到原地開頭[](int n){ return n > 5; }, 99);
for(auto x : v)cout << x << " ";
  • ranges
std::ranges::replace_copy(v,v.begin(),1, 99);
std::ranges::replace_copy_if(v,v.begin(),[](int n){ return n > 5; }, 99);

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/214346.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/214346.shtml
英文地址,請注明出處:http://en.pswp.cn/news/214346.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

java--StringBuilder、StringBuffer、StringJoiner

1.StringBuilder ①StringBuilder代表可變字符串對象&#xff0c;相當于是一個容器&#xff0c;它里面裝的字符串是可以改變的&#xff0c;就是用來操作字符串的。 ②好處&#xff1a;StringBuilder比String更適合做字符串的修改操作&#xff0c;效率會比更高&#xff0c;代碼…

Java入門:EditPlus的安裝與配置講解

1. 前言 Java是一種面向對象的編程語言&#xff0c;廣泛應用于各種平臺和設備。在Java開發過程中&#xff0c;一個好的集成開發環境&#xff08;IDE&#xff09;是非常重要的。EditPlus是一款簡單易用的文本編輯器&#xff0c;它提供了一些方便的功能來支持Java開發。本文將介…

【開源】基于JAVA的木馬文件檢測系統

項目編號&#xff1a; S 041 &#xff0c;文末獲取源碼。 \color{red}{項目編號&#xff1a;S041&#xff0c;文末獲取源碼。} 項目編號&#xff1a;S041&#xff0c;文末獲取源碼。 目錄 一、摘要1.1 項目介紹1.2 項目錄屏 二、功能模塊2.1 數據中心模塊2.2 木馬分類模塊2.3 木…

Leo贈書活動-13期 【以企業架構為中心的SABOE數字化轉型五環法】文末送書

Leo贈書活動-13期 【以企業架構為中心的SABOE數字化轉型五環法】文末送書 ?作者簡介&#xff1a;大家好&#xff0c;我是Leo&#xff0c;熱愛Java后端開發者&#xff0c;一個想要與大家共同進步的男人&#x1f609;&#x1f609; &#x1f34e;個人主頁&#xff1a;Leo的博客…

記錄 | xshell輸出錯亂解決

輸出錯亂問題&#xff1a; 解決方法&#xff1a;

VS Code使用 CMake 或 Makefile管理C++多文件編譯

VS Code使用 CMake 或 Makefile管理C多文件編譯 一、Cmake方式1、文件結構2、構建項目 二、Makefile方式1、文件結構2、Makefile3、構建項目 三、附件示例中使用到的文件及代碼 使用 CMake 或 Makefile 是更加標準和靈活的方法來管理多文件編譯。以下是一個簡單的示例&#xff…

80個常用shell命令及簡單用法

Shell命令是Linux和Unix系統中的基礎&#xff0c;用于完成各種操作&#xff0c;如文件管理、程序執行、文本處理等。下面列舉一些常用的Shell命令&#xff0c;并詳細解釋它們的功能及應用場景&#xff1a; ls - 列出目錄內容 功能&#xff1a;列出指定目錄中的文件和目錄。應用…

智能優化算法應用:基于郊狼算法3D無線傳感器網絡(WSN)覆蓋優化 - 附代碼

智能優化算法應用&#xff1a;基于郊狼算法3D無線傳感器網絡(WSN)覆蓋優化 - 附代碼 文章目錄 智能優化算法應用&#xff1a;基于郊狼算法3D無線傳感器網絡(WSN)覆蓋優化 - 附代碼1.無線傳感網絡節點模型2.覆蓋數學模型及分析3.郊狼算法4.實驗參數設定5.算法結果6.參考文獻7.MA…

Mybatis增刪改查基礎

MyBatis可根據查詢的結果類型、查詢條件的不同進行統一處理。 1 查詢數據 1.1 根據查詢數據條數來分析不同的情況 1.1.1 查詢單條數據 可以通過實體類、list集合、map等處理查詢結果。 通過實體類查詢單條數據 User queryUserById(Param("id") Integer id);<…

C、C++、C#的區別概述

C、C、C#的區別概述 https://link.zhihu.com/?targethttps%3A//csharp-station.com/understanding-the-differences-between-c-c-and-c/文章翻譯源于此鏈接 01、C語言 ? Dennis Ritchie在1972年創造了C語言并在1978年公布。Ritchie設計C的初衷是用于開發新版本的Unix。在那之…

express框架使用

一、express介紹 express 是一個基于 Node.js 平臺的極簡、靈活的 WEB 應用開發框架&#xff0c;簡單來說&#xff0c;express 是一個封裝好的工具包&#xff0c;封裝了很多功能&#xff0c;便于我們開發 WEB 應用&#xff08;HTTP 服務&#xff09; 二、express 使用 2.1 e…

【組合數學】遞推關系

目錄 1. 遞推關系建立2. 常系數齊次遞推關系的求解3. 常系數非齊次遞推關系的求解4. 迭代法 1. 遞推關系建立 給定一個數的序列 f ( 0 ) , f ( 1 ) , . . . , f ( n ) , . . . , f (0), f(1), ..., f(n ),... , f(0),f(1),...,f(n),..., 若存在整數 n 0 n_0 n0? &#xff…

datav-實現輪播表,使用updateRows方法-無縫銜接加載數據

前言 最近在做大屏需求的時候&#xff0c;遇到一個輪播數據的需求&#xff0c;查看datav文檔發現確實有這個組件 但這個組件只提供了一次加載輪播的例子&#xff0c;雖然提供了輪播加載數據updateRows方法 但是文檔并沒有觸發事件&#xff0c;比如輪播完數據觸發事件&#xf…

ESL電子標簽的真相:電子墨水屏沒墨水?

一說到電子墨水屏 你大概率會想到Kindle 如果你問是不是墨水做的 那這篇文章你就得好好看看了 在我們日常與客戶的溝通中 為數不多卻出乎意料地有好幾個以下對話↓ 在此辟謠 電子墨水屏里確實 沒 有 墨 水 那它是什么樣的原理&#xff1f;為什么越來越多顯示設備采用&…

Abp vNext在Docker部署并導出鏡像

Docker介紹 Docker 是一個開源的應用容器引擎&#xff0c;讓開發者可以打包他們的應用以及依賴包到一個可移植的鏡像中&#xff0c;然后發布到任何流行的 Linux或Windows操作系統的機器上&#xff0c;也可以實現虛擬化。容器是完全使用沙箱機制&#xff0c;相互之間不會有任何…

深度剖析中國居民消費價格指數CPI數據可視化案例-Python可視化技術實現(附完整源碼)【數據可視化項目案例-16】

?????? 你的技術旅程將在這里啟航! ???? 本專欄包括所有的可視化技術學習,感興趣可以到本專欄頁面,查閱可視化寶典可快速了解本專欄。訂閱專欄用戶可以在每篇文章底部下載對應案例源碼以供大家深入的學習研究。 ?? 每一個案例都會提供完整代碼和詳細的講解,不論…

Win11在Virtualbox上安裝ubuntu操作系統

注&#xff1a;原創筆記&#xff0c;以下圖片水印為本人 相關工具展示 第四個&#xff1a;ubuntu的vmdk文件&#xff0c;用于配置虛擬機 第5/6個&#xff1a;virtualbox安裝包 一、安裝 VirtualBox 由于win11版本問題&#xff0c;如果裝不了 virtualBox需要在官網安裝最新版…

新零售模式:跨境電商如何實現線上線下融合?

隨著數字時代的發展&#xff0c;新零售模式逐漸嶄露頭角&#xff0c;成為跨境電商發展的重要趨勢。線上線下融合不僅拓寬了銷售渠道&#xff0c;更提供了更豐富、更便捷的購物體驗。 本文將深入探討新零售模式在跨境電商中的應用&#xff0c;以及如何實現線上線下融合&#xf…

前后端請求之nginx配置

問題&#xff1a; 前端發送的請求&#xff0c;是如何請求到后端服務器的&#xff1f; 如&#xff0c;前端請求地址&#xff1a;http://loclhost/api/employee/login&#xff1a; 后端相應請求地址&#xff1a;http://loclhost:8080/admin/employee/login 回答&#xff1a; …

使用MfgTool燒寫前需準備的文件

一. 簡介 本文我們就來學習&#xff0c;如何將我們編譯的 uboot&#xff0c;zImage&#xff08;內核鏡像&#xff09;&#xff0c;xxx.dtb設備樹文件&#xff0c;還有制作的根文件系統&#xff0c;這四個文件燒寫到開發板中&#xff0c;最后 開發板能正常啟動。 本文這里使用…