C++常見的仿函數,預定義函數,functor,二元操作函數(對vector操作,加減乘除取余位運算等 )

C++ 標準庫在 <functional> 頭文件中為我們提供了一套非常方便的預定義函數對象(也稱為“仿函數”或 “functor”),它們可以像變量一樣直接傳遞給 std::reduce 和其他標準算法。

你提到的 std::bit_orstd::multiplies 就是其中的成員。這些函數對象的好處是代碼更具可讀性,并且可以避免手寫簡單的 lambda 表達式。

從 C++14 開始,這些函數對象大多有了“透明”版本(使用 std::plus<> 而不是 std::plus<int>),這讓它們使用起來更加方便,因為你不需要手動指定類型,編譯器會自動推斷。

下面是這些常用函數對象的分類介紹和 std::reduce 的使用示例。


1. 算術操作 (Arithmetic Functors)

這些是最常見的聚合操作。

函數對象 (透明版本)作用C++ 操作符示例 reduce 初始值
std::plus<>()加法a + b00.0
std::minus<>()減法a - bN/A (不滿足結合律)
std::multiplies<>()乘法a * b11.0
std::divides<>()除法a / bN/A (不滿足結合律)
std::modulus<>()取模a % bN/A (不滿足結合律)
std::negate<>()取反 (一元)-a(不適用于reduce)

注意: minusdivides 通常不用于 std::reduce,因為它們不滿足并行計算所必需的結合律(((a-b)-c)-d) 的結果與 (a-b) + (c-d) 通常是不同的。

代碼示例:

#include <iostream>
#include <vector>
#include <numeric>
#include <functional> // 必須包含int main() {std::vector<int> nums = {1, 2, 3, 4, 5};// 求和int sum = std::reduce(nums.begin(), nums.end(), 0, std::plus<>());std::cout << "Sum: " << sum << std::endl; // 輸出: 15// 求積long long product = std::reduce(nums.begin(), nums.end(), 1LL, std::multiplies<>());std::cout << "Product: " << product << std::endl; // 輸出: 120
}

2. 位運算 (Bitwise Functors)

這些在你需要對一系列整數進行位操作時非常有用。

函數對象 (透明版本)作用C++ 操作符示例 reduce 初始值
std::bit_and<>()按位與a & b~0 (所有位都為1)
std::bit_or<>()按位或`ab`
std::bit_xor<>()按位異或a ^ b0
std::bit_not<>()按位取反 (一元)~a(不適用于reduce)

代碼示例:

#include <iostream>
#include <vector>
#include <numeric>
#include <functional>int main() {std::vector<unsigned int> flags = {0b0001, 0b0010, 0b1000}; // 1, 2, 8// 將所有標志位合并 (OR)// 0 | 1 | 2 | 8 = 11 (0b1011)unsigned int all_flags = std::reduce(flags.begin(), flags.end(), 0u, std::bit_or<>());std::cout << "All flags (OR): " << all_flags << std::endl; // 輸出: 11// 找到所有共有位 (AND)std::vector<unsigned int> masks = {0b1101, 0b0111, 0b1111};// 0b1101 & 0b0111 & 0b1111 = 0b0101 (5)// 初始值需要是全1,否則任何數與0做&運算都會得到0unsigned int common_bits = std::reduce(masks.begin(), masks.end(), ~0u, std::bit_and<>());std::cout << "Common bits (AND): " << common_bits << std::endl; // 輸出: 5
}

3. 邏輯運算 (Logical Functors)

這些通常用于聚合布爾值。

函數對象 (透明版本)作用C++ 操作符示例 reduce 初始值
std::logical_and<>()邏輯與a && btrue
std::logical_or<>()邏輯或`a
std::logical_not<>()邏輯非 (一元)!a(不適用于reduce)

代碼示例:

#include <iostream>
#include <vector>
#include <numeric>
#include <functional>int main() {std::vector<bool> conditions = {true, false, true};// 檢查是否所有條件都為真 (AND)bool all_true = std::reduce(conditions.begin(), conditions.end(), true, std::logical_and<>());std::cout << "All true? " << std::boolalpha << all_true << std::endl; // 輸出: false// 檢查是否至少一個條件為真 (OR)bool any_true = std::reduce(conditions.begin(), conditions.end(), false, std::logical_or<>());std::cout << "Any true? " << std::boolalpha << any_true << std::endl; // 輸出: true
}

4. 比較運算 (Comparison Functors) - 用于求最值

比較運算符本身不直接用于聚合,但它們是構建求最大/最小值邏輯的核心。雖然你可以直接使用 lambda 表達式 std::minstd::max,但了解它們的存在也很有用。

函數對象 (透明版本)作用C++ 操作符
std::equal_to<>()等于a == b
std::not_equal_to<>()不等于a != b
std::greater<>()大于a > b
std::less<>()小于a < b
std::greater_equal<>()大于等于a >= b
std::less_equal<>()小于等于a <= b

求最值的最佳實踐是使用 Lambda 表達式,因為它們更清晰。

代碼示例:

#include <iostream>
#include <vector>
#include <numeric>
#include <algorithm> // for std::min/maxint main() {std::vector<int> nums = {10, -5, 100, 30, -20};if (nums.empty()) return 1;// 求最大值// 初始值設為第一個元素,避免空容器或所有元素都為負數的問題int max_val = std::reduce(std::next(nums.begin()), // 從第二個元素開始nums.end(),              // 到末尾nums.front(),            // 初始值為第一個元素[](int a, int b) { return std::max(a, b); } // 使用 std::max);std::cout << "Max value: " << max_val << std::endl; // 輸出: 100// 求最小值int min_val = std::reduce(std::next(nums.begin()),nums.end(),nums.front(),[](int a, int b) { return std::min(a, b); } // 使用 std::min);std::cout << "Min value: " << min_val << std::endl; // 輸出: -20
}

總結

  • <functional> 頭文件是你的好朋友,它提供了豐富的預定義函數對象。
  • 使用透明函數對象(如 std::plus<>())是現代C++的最佳實踐,代碼更簡潔。
  • 對于簡單的、標準的操作(加、乘、位運算),直接使用這些函數對象非常方便。
  • 對于更復雜的邏輯,尤其是求最值,Lambda 表達式通常是更靈活、更具可讀性的選擇。
  • 使用 reduce 時,選擇正確的初始值至關重要,它決定了整個計算的基礎。

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

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

相關文章

【RH134 問答題】第 6 章 管理 SELinux 安全性

目錄SELinux 是如何保護資源的&#xff1f;什么是自由決定的訪問控制(DAC)&#xff1f;它有什么特點&#xff1f;什么是強制訪問控制(MAC)&#xff1f;它有什么特點&#xff1f;什么是 SELinux 上下文&#xff1f;setenforce 0 命令的作用是什么&#xff1f;定義一條 SELinux 文…

【MacOS】發展歷程

很高興為您詳細介紹 macOS 的詳細發展歷程。macOS 是蘋果公司開發的操作系統&#xff0c;用于 Mac 電腦、iPad 和 Apple TV 等設備。以下是 macos 的主要版本和發展歷程&#xff1a;1. System 7 (1991)發布日期&#xff1a;1991年特點&#xff1a;引入多任務處理功能。改進了拖…

智慧社區項目開發(二)——基于 JWT 的登錄驗證功能實現詳解

在 Web 應用中&#xff0c;登錄驗證是保障系統安全的核心環節。本文將結合具體接口文檔&#xff0c;詳細講解如何基于 JWT&#xff08;JSON Web Token&#xff09;實現登錄驗證功能&#xff0c;包括 JWT 配置、工具類封裝、登錄流程處理等關鍵步驟&#xff0c;幫助開發者快速理…

Jmeter的元件使用介紹:(七)后置處理器詳解

Jmeter的后置處理器主要用于取樣器執行后的提取數據操作。 Jmeter常用的后置處理器有:Json提取器、正則表達式提取器、邊界提取器、Beanshell后置處理器。此外還有Xpath提取器、CSS選擇器提取器等&#xff0c;由于這兩項多用前端頁面提取元素&#xff0c;目前的項目基本都是采…

Allure的安裝,在Pytest中的簡單使用以及生成測試報告

目錄 1.Allure的安裝 1--下載網址 2--選擇對應系統版本下載 3--配置Allure環境變量 4--驗證安裝是否成功 5--配置JAVAJDK的環境變量&#xff08;如果已經配置&#xff0c;可以忽視這一步&#xff09; 2.python中pytestAllure 1--python安裝Allure包 2--生成測試報告 1--使用pyt…

Oracle 數據庫報 ora-00257 錯誤并且執行alter system switch logfile 命令卡死的解決過程

Oracle 數據庫報 ora-00257 錯誤并且執行alter system switch logfile 命令卡死的解決過程 7月26日下午&#xff0c;某醫院用戶的 HIS 系統無法連接&#xff0c;報如下錯誤&#xff1a;初步判斷是歸檔日志問題。 用戶的 HIS 系統數據庫是雙節點 Oracle 11g Rac 集群。登錄服務器…

ArKTS:List 數組

一種&#xff1a;/**# encoding: utf-8# 版權所有 2025 ©涂聚文有限公司? # 許可信息查看&#xff1a;言語成了邀功盡責的功臣&#xff0c;還需要行爲每日來值班嗎# 描述&#xff1a; 數組# Author : geovindu,Geovin Du 涂聚文.# IDE : DevEco Studio 5.1.1 …

Spring Boot 3整合Spring AI實戰:9輪面試對話解析AI應用開發

Spring Boot 3整合Spring AI實戰&#xff1a;9輪面試對話解析AI應用開發 第1輪&#xff1a;基礎配置與模型調用 周先生&#xff1a;cc&#xff0c;先聊聊Spring AI的基礎配置吧。如何在Spring Boot 3項目中集成Ollama&#xff1f; cc&#xff1a;我們可以通過OllamaConfig.java…

標準SQL語句示例

一、基礎操作1. 數據庫操作-- 1. 創建數據庫 CREATE DATABASE 數據庫名稱 CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;-- 2. 刪除數據庫 DROP DATABASE IF EXISTS 數據庫名稱;-- 3. 選擇數據庫 USE 數據庫名稱;-- 4. 顯示所有數據庫 SHOW DATABASES;-- 5. 查看數據庫創…

STM32-基本定時器

一.基本定時器簡介 STM32F1 系列共有 8 個定時器&#xff0c;分別為&#xff1a;基本定時器、通用定時器、高級定時器。基本定時器 TIM6 和 TIM7 是一個 16 位的只能向上計數的定時器&#xff0c;只能定時&#xff0c;沒有外部IO。 二.基本定時器功能 上圖為基本定時器的功能框…

ofd文件轉pdf

主要后端使用Java實現&#xff0c;前端可隨意搭配http請求添加依賴&#xff1a;<!-- OFD解析與轉換庫 --><dependency><groupId>org.ofdrw</groupId><artifactId>ofdrw-converter</artifactId><version>1.17.9</version></…

4.應用層自定義協議與序列化

1.應用層程序員寫的一個個解決我們實際問題, 滿足我們日常需求的網絡程序, 都是在應用層1.1再談“協議”協議是一種 "約定". socket api 的接口, 在讀寫數據時, 都是按 "字符串" 的方式來發送接收的. 如果我們要傳輸一些 "結構化的數據" 怎么辦呢…

【QT搭建opencv環境】

本文參考以下文章&#xff1a; https://blog.csdn.net/weixin_43763292/article/details/112975207 https://blog.csdn.net/qq_44743171/article/details/124335100 使用軟件 QT 5.14.2下載地址&#xff1a;download.qt.io 選擇版本&#xff1a;Qt 5.14.2 Qt 5.14.2百度網盤鏈接…

golang--函數棧

一、函數棧的組成結構&#xff08;棧幀&#xff09; 每個函數調用對應一個棧幀&#xff0c;包含以下核心部分&#xff1a; 1. 參數區 (Arguments) 位置&#xff1a;棧幀頂部&#xff08;高地址端&#xff09;內容&#xff1a; 函數調用時傳入的參數按從右向左順序壓棧&#xff…

【FAQ】創建Dynamics 365 Sales環境

參考文章&#xff1a;5 分鐘內安裝 Dynamics 365 Sales 步驟 1&#xff1a;訪問 Power Platform 管理中心 導航到make.powerapps.com&#xff0c;然后點擊右上角的齒輪圖標。選擇管理中心&#xff0c;或者訪問aka.ms/ppac訪問 Power Platform 管理中心。 第 2 步&#xff1a…

【數據庫】使用Sql Server將分組后指定字段的行數據轉為一個字段顯示,并且以逗號隔開每個值,收藏不迷路

大家好&#xff0c;我是全棧小5&#xff0c;歡迎來到《小5講堂》。 這是《Sql Server》系列文章&#xff0c;每篇文章將以博主理解的角度展開講解。 溫馨提示&#xff1a;博主能力有限&#xff0c;理解水平有限&#xff0c;若有不對之處望指正&#xff01; 目錄前言示例數據集數…

7.項目起步(1)

1&#xff0c;項目起步-初始化項目并使用git管理創建項目并精細化配置src目錄調整git 管理項目2項目起步-配置別名路徑聯想提示什么是別名路徑聯想提示如何進行配置 &#xff08;自動配置了&#xff09;{"compilerOptions" : {"baseUrl" : "./",…

【C++詳解】深入解析繼承 類模板繼承、賦值兼容轉換、派生類默認成員函數、多繼承與菱形繼承

文章目錄一、繼承概念二、繼承定義定義格式繼承后基類成員訪問方式的變化類模板的繼承三、基類和派?類間的轉換(賦值兼容轉換)四、繼承中的作用域隱藏規則兩道筆試常考題五、派生類的默認成員函數四個常見默認成員函數實現?個不能被繼承的類六、繼承與友元七、繼承與靜態成員…

加法器 以及ALU(邏輯算術單元)

加法器框架&#xff0c;首先介紹原理&#xff0c;然后引入一位加法器最后再引入多位加法器最后引入帶符號的加法器這一節涉及到的硬件電路的知識理解就好&#xff0c;實在看不懂就跳過&#xff0c;但是封裝以后的功能必須看懂。這是一個一般的加法過程涉及到的必要元素圖中已經…

設計模式實戰:自定義SpringIOC(親手實踐)

上一篇&#xff1a;設計模式實戰&#xff1a;自定義SpringIOC&#xff08;理論分析&#xff09; 自定義SpringIOC&#xff08;親手實踐&#xff09; 上一篇文章&#xff0c;我們介紹了SpringIOC容器的核心組件及其作用&#xff0c;下面我們來動手仿寫一個SpringIOC容器&#…