97色伦色在线综合视频,无玛专区,18videosex性欧美黑色,日韩黄色电影免费在线观看,国产精品伦理一区二区三区,在线视频欧美日韩,亚洲欧美在线中文字幕不卡

網站制作設計多少錢什么是網絡工程師

鶴壁市浩天電氣有限公司 2026/01/24 12:33:21
網站制作設計多少錢,什么是網絡工程師,縣級門戶網站建設運營成本,魔獸做宏網站可調用對象function類 函數指針 用于指向普通成員函數和靜態(tài)成員函數 定義與使用 定義一個普通函數 int func(int, int);定義函數指針類型的變量 int (*funcPtr)(int, int); //指針通常用ptr表示使用函數指針的實例#xff1a; #includeiostream//定義函數指針…可調用對象function類函數指針用于指向普通成員函數和靜態(tài)成員函數定義與使用定義一個普通函數int func(int, int);定義函數指針類型的變量int (*funcPtr)(int, int); //指針通常用ptr表示使用函數指針的實例#includeiostream //定義函數指針類型的變量 int (*funcPtr)(int, int); //定義一個普通函數 int add(int a, int b){ return a b; } int main() { //函數指針指向函數 funcPtr add; //也可以寫funcPtr add;函數名等于函數的地址 //調用函數指針指向的函數 funcPtr(1, 2); //不用寫成(*funcPtr)(1, 2),編譯器會自動解引用兩種寫法效果一樣 return 0; }優(yōu)點與局限性優(yōu)點簡單直觀適用于簡單的回調函數1。局限性不能捕獲上下文如lambda中的閉包。語法相對復雜尤其是指針的聲明和使用。仿函數Functors)仿函數又稱為函數對象是在C中重載了operator()的類或結構體實例仿函數不僅可以像普通函數一樣被調用還能攜帶狀態(tài)。定義和使用代碼實例#includeiostream struct Adder{ int to_add; Adder(int value) : to_add(value){} //構造函數 int operator()(int x){ //重載() return x to_add; } }; int main() { Adder adder(5); adder(10); //adder是結構體Adder的實例且結構體內重載了(),所以可以像函數一樣使用 std::cout510adder(10)std::endl;//輸出51015 return 0; }特點攜帶狀態(tài)仿函數可以擁有內部狀態(tài)通過成員變量存儲數據使其在調用時具備上下文信息。靈活性高可以根據需要添加更多的成員函數和變量擴展功能。性能優(yōu)化編譯器可以對仿函數進行優(yōu)化。仿函數應用場景1.高級實例#includeiostream //可變累加器仿函數 struct Accumulator{ int sum; Accumulator() : sum(0){} //重載() void operator()(int x){ return sum x; } }; int main() { Accumulator acc; acc(10); acc(20); acc(30); std::cout acc.sum std::endl; //輸出60 return 0; }2.使用仿函數的標準庫算法#includeiostream #includevector #includealgorithm //反函數判斷一個數是否大于某個閾值 struct IsGreaterThan{ int threshold; //閾值的英文 IsGreaterThan(int t) : threshold(t){} bool operator()(int x) const { return x threshold; } }; int main() { std::vectorint numbers {1, 5, 10, 15, 20}; //使用仿函數進行篩選 IsGreaterThan greaterThan10(10); auto it std::find_if(numbers.begin(), numbers.end(), greaterThan10); if(it ! numbers.end()){ std::cout 第一個大于10的數是 *it std:;endl; }else{ std::cout 沒有找到大于10的數 std:;endl; } return 0; }find_if()是在迭代器指定范圍內查找第一個滿足自定義條件的元素前兩個參數傳入查找范圍的迭代器第三個參數是一元謂詞他是一個可調用對象函數Lambda函數對象等作用是定義查找查找條件接受遍歷到的元素作為參數返回bool。3.仿函數與模板#includeiostream #includevector #includealgorithm //通用比較仿函數 templatetypename T struct Compare{ bool operator()(const T a, const T b){ return a b; } }; int main() { std::vectorint numbers {5, 2, 8, 1, 9}; //使用仿函數進行排序 std::sort(numbers.begin(), numbers.end(), Compareint()); for(auto it : numbers) { std::cout num ; //輸出1,2,5,8,9 } retuurn 0; }std::sort主要使用快速排序4.仿函數的優(yōu)勢可擴展性能夠根據需要添加更多功能和狀態(tài)。與Lambda互補性在需要攜帶復雜狀態(tài)或多次調用時仿函數比Lambda更適合。類型安全仿函數是具體的類型可以在編譯期進行類型檢查。5.何時使用仿函數需要攜帶狀態(tài)時當回調函數需要維護內部狀態(tài)時仿函數是理想選擇。復雜操作當簡單的函數指針或Lambda難以表達復雜邏輯時。性能關鍵場景由于仿函數可以被編譯器優(yōu)化適用于性能敏感的代碼。Lambda表達式Lambda表達式是C11引入的一種輕量級函數對象允許在代碼中定義匿名函數。它們可以捕獲周圍的變量具有更強的表達能力?;菊Z法[captures](parameters) - return_type{ //函數體 }captures捕獲外部變量的方式可以是值捕獲、引用捕獲或者混合捕獲。parameters參數列表。return_type返回類型可以省略省略后需把-一起刪掉編譯器會自動推導。#includeiostream #includevector #includealgorithm int main() { int threshold 5; std::vectorint numbers {1,6,3,8,2,7}; auto new_end std::remove_if(numbers.begin(), numbers.end(), [threshold](int n){//值捕獲把threshold的值捕獲使用 return x threshold; }); numbers.erase(new_end, numbers.end()); for(auto n : numbers){ std::cout n ; //輸出6,8,7 } std::coutstd::endl; return 0; }示例中remove_if()是把大于等于5的數字移動到容器前前面小于5的數字會被覆蓋掉在C中 remove_if 是一個標準庫算法用于移除容器中滿足特定條件的元素。它不會真正從容器中刪除元素而是將不滿足條件的元素移動到容器的前面并返回一個指向新邏輯末尾的迭代器嗎可以結合 erase 方法來實現真正的刪除。捕獲方式值捕獲[]捕獲所有外部變量的副本若要修改需加mutable關鍵字修改不會影響原變量。引用捕獲[]捕獲所有外部變量的引用直接操作原變量無需mutable關鍵字即可修改。混合捕獲指定部分變量按值捕獲部分按引用捕獲如[, var]或[, var]。無捕獲[]不捕獲任何外部變量。#includeiostream #includememory struct Adder{ int to_add; Adder(int value) : to_add(value){} //構造函數 int operator()(int x){ //重載() return x to_add; } void add(int x){ to_add x; } }; int main() { auto add_ptr std::make_sharedAdder(10); auto lambda1 [add_ptr](int x){ //lambda1經過這個lambda表達式后就是一個可調用對象 add_ptr-add(x); //打印引用計數 std::cout add_ptr.use_count() std::endl; //2 //這個智能指針被[]通過值的方式捕獲相當于捕獲這個智能指針的副本兩個智能指針指向這塊內存引用計數加一 }; lambda1(5); return 0; }可變Lambda默認情況下Lambda表達式是不可變的 const 。通過 mutable 關鍵字可以允許修改捕獲的變量副本。不常用#includeiostream int main() { int count 0; auto increment [count]() mutable{ count; std::cout Count inside Lambda: count std::endl; }; increment(); //輸出Count inside Lambda: 1 increment(); //輸出Count inside Lambda: 2 std::cout Count outside Lambda: count std::endl; //輸出Count outside Lambda: 0 return 0; }捕獲成員函數和類變量#includeiostream #includevector #includealgorithm class Processor { public: Processor(int x) : _threshold(x) {} void process(std::vectorint data) { std::cout 處理前的數據 std::endl; for(auto num : data) std::cout num ; std::coutstd::endl; //使用Lambda表達式進行過濾 data.erase(std::remove_if(data.begin(), data.end(), [this](int n){ return n _threshold; }), data.end()); std::cout 處理后的數據 std::endl; for(auto num : data) std::cout num ; std::coutstd::endl; } private: int _threshold; //變量前加下劃線隱含“私有/內部使用” }; int main() { std::vectorint numbers {1, 6, 3, 8, 2, 7}; Processor proc(5); proc.process(numbers); /* 輸出 處理前的數據1 6 3 8 2 7 處理后的數據6 8 7 */ return 0; }Lambda與標準庫算法#includeiostrea #includevector #includealgorithm int main() { std::vectorint numbers {4, 2, 5, 1, 3} //使用Lambda表達式進行排序 std::sort(numbers.begin(), numbers.end(), [](int a, int b) - bool { return a b; }); std::cout 排序后的數字; for(auto num : numbers){ std::cout num ; //輸出1 2 3 4 5 } std::cout std::endl return 0; }Lambda表達式的優(yōu)勢簡潔性代碼更加緊湊易于理解。靈活性能夠捕獲外部變量適應更多場景。性能優(yōu)化編譯器可以對Lambda進行優(yōu)化如內聯展開。與標準庫的良好集成與STL算法無縫結合簡化代碼邏輯。std::function 對象std::function 是C11提供的一個通用的可調用包裝器能夠封裝任何可調用對象包括普通函數、Lambda表達式、函數對象以及綁定表達式。它實現了類型擦除使得不同類型的可調用對象可以通過統(tǒng)一的接口進行操作。#include iostream #include functional // 普通函數 int add(int a, int b) { return a b; } // 函數對象 struct Multiply { int operator()(int a, int b) const { return a * b; } }; int main() { // 封裝普通函數 std::functionint(int, int) func1 add; std::cout Add: func1(3, 4) std::endl; // 輸出Add: 7 // 封裝Lambda表達式 std::functionint(int, int) func2 [](int a, int b) - int { return a - b; }; std::cout Subtract: func2(10, 4) std::endl; // 輸出Subtract: 6 // 封裝函數對象 Multiply multiply; std::functionint(int, int) func3 multiply; std::cout Multiply: func3(3, 4) std::endl; // 輸出Multiply: 12 return 0; }特點類型擦除可以存儲任何符合簽名的可調用對象。靈活性支持動態(tài)改變存儲的可調用對象。性能開銷相比于直接使用函數指針或Lambda std::function 可能帶來一定的性能開銷尤其是在頻繁調用時。用法場景回調函數的傳遞。事件處理系統(tǒng)。策略模式的實現。示例回調機制#include iostream #include functional // 定義回調類型 using Callback std::functionvoid(int); // 觸發(fā)事件的函數 void triggerEvent(Callback cb, int value) { // 事件發(fā)生調用回調 cb(value); } int main() { // 使用Lambda作為回調 triggerEvent([](int x) { std::cout 事件觸發(fā)值為 x std::endl; }, 42); // 輸出事件觸發(fā)值為42 // 使用仿函數作為回調 struct Printer { void operator()(int x) const { std::cout Printer打印值 x std::endl; } } printer; triggerEvent(printer, 100); // 輸出Printer打印值100 return 0; }存儲和調用不同類型的可調用對象#include iostream #include functional #include vector int add(int a, int b) { return a b; } struct Multiply { int operator()(int a, int b) const { return a * b; } }; int main() { std::vectorstd::functionint(int, int) operations; // 添加不同類型的可調用對象 operations.emplace_back(add); // 普通函數 operations.emplace_back(Multiply()); // 仿函數 operations.emplace_back([](int a, int b) - int { return a - b; }); // lambda // 執(zhí)行所有操作 for(auto op : operations) { std::cout op(10, 5) ; // 輸出15 50 5 } std::cout std::endl; return 0; }std::bind操作std::bindC11中提供的一個函數適配器用于綁定函數或可調用對象的部分參數生成一個新的可調用對象。它允許提前固定某些參數簡化函數調用或適應接口需求。#include iostream #include functional // 普通函數 int add(int a, int b) { return a b; } int main() { // 綁定第一個參數為10生成新的函數對象 auto add10 std::bind(add, 10, std::placeholders::_1); std::cout 10 5 add10(5) std::endl; // 輸出10 5 15 return 0; }bind頭文件也在functional里。占位符std::placeholdersstd::bind使用占位符來表示未綁定的參數這些占位符決定了在生成的新函數對象中如何傳遞參數。常用占位符包括std::placeholder::_1std::placeholder::_2std::placeholder::_3等等最多10個。以 _1 、 _2 、 _3 …表示代表新可調用對象被調用時的第1、2、3…個參數。屬于 std::placeholders 命名空間使用時需顯式指定如 std::placeholders::_1 。#include iostream #include functional void display(const std::string msg, int count) { for(int i 0; i count; i) { std::cout msg std::endl; } } int main() { // 綁定消息為Hello生成新的函數對象只需要傳遞次數 auto sayHello std::bind(display, Hello, std::placeholders::_1); sayHello(3); /* 輸出: Hello Hello Hello */ // 綁定次數為2生成新的函數對象只需要傳遞消息 auto sayTwice std::bind(display, std::placeholders::_1, 2); sayTwice(Hi); /* 輸出: Hi Hi */ return 0; }與Lambda表達式的對比std::bind曾在C11中廣泛使用但隨著Lambda表達式的普及很多情況下Lambda更為直觀和高效。不過在某些復雜的參數綁定場景下std::bind依然有其獨特優(yōu)勢。使用std::bind#include iostream #include functional int multiply(int a, int b) { return a * b; } int main() { // 綁定第一個參數為2生成新的函數對象 auto multiplyBy2 std::bind(multiply, 2, std::placeholders::_1); std::cout 2 * 5 multiplyBy2(5) std::endl; // 輸出2 * 5 10 return 0; }使用Lambda表達式#include iostream #include functional int multiply(int a, int b) { return a * b; } int main() { // 使用Lambda表達式綁定第一個參數為2 auto multiplyBy2 [](int b) - int { return multiply(2, b); }; std::cout 2 * 5 multiplyBy2(5) std::endl; // 輸出2 * 5 10 return 0; }使用std::bind綁定成員函數#include iostream #include functional class Calculator { public: int multiply(int a, int b) const { return a * b; } }; int main() { Calculator calc; // 綁定成員函數multiply固定第一個參數為5 auto multiplyBy5 std::bind(Calculator::multiply, calc, 5, std::placeholders::_1); std::cout 5 * 3 multiplyBy5(3) std::endl; // 輸出5 * 3 15 return 0; }類的成員函數需要加取地址符使用Lambda表達式綁定成員函數#include iostream #include functional class Greeter { public: void greet(const std::string name) const { std::cout Hello, name ! std::endl; } }; int main() { Greeter greeter; // 使用Lambda表達式綁定成員函數 auto greetFunc [greeter](const std::string name) { greeter.greet(name); }; greetFunc(Alice); // 輸出Hello, Alice! return 0; }如果綁定的成員函數有返回值在Lambda表達式中要return。綁定靜態(tài)成員函數靜態(tài)成員函數不依賴于類的實例可以像普通函數一樣使用std::bind和std::function。#include iostream #include functional class Logger { public: static void log(const std::string message) { std::cout Log: message std::endl; } }; int main() { // 使用std::bind綁定靜態(tài)成員函數 auto logFunc std::bind(Logger::log, std::placeholders::_1); logFunc(This is a static log message.); // 輸出Log: This is a static log message. return 0; }綁定帶有返回值的成員函數#include iostream #include functional class Math { public: double power(double base, double exponent) const { double result 1.0; for(int i 0; i static_castint(exponent); i) { result * base; } return result; } }; int main() { Math mathObj; // 綁定成員函數power固定基數為2 auto powerOf2 std::bind(Math::power, mathObj, 2.0, std::placeholders::_1); std::cout 2^3 powerOf2(3) std::endl; // 輸出2^3 8 return 0; }注意事項對象生命周期綁定成員函數時確保對象在可調用對象使用期間依然存在以避免懸空指針問題。指針與引用可以通過指針或引用傳遞對象實例給std::bind或Lambda表達式。捕獲方式在使用Lambda表達式時選擇合適的捕獲方式值捕獲或引用捕獲以確保對象的正確訪問?;卣{函數是指被作為參數傳遞給另一個函數稱為“主調函數”的函數主調函數在合適時機會調用這個回調函數。 ??
版權聲明: 本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如若內容造成侵權/違法違規(guī)/事實不符,請聯系我們進行投訴反饋,一經查實,立即刪除!

山東建站商城局域網內部如何做網站

山東建站商城,局域網內部如何做網站,中咨城建設計南京網站,網站建設免費模板下載#x1f493; 博客主頁#xff1a;瑕疵的CSDN主頁 #x1f4dd; Gitee主頁#xff1a;瑕疵的gite

2026/01/23 07:27:01

中國建設銀行 英文網站網站 流程

中國建設銀行 英文網站,網站 流程,剁椒怎么做制作方法,電子商務網站建設的意義是什么意思Qdrant向量數據庫自動化運維指南#xff1a;零停機時間實戰(zhàn)手冊 【免費下載鏈接】qdrant Qdrant

2026/01/23 12:06:01

技術成果交易網站建設方案網站模板psd

技術成果交易網站建設方案,網站模板psd,自己建還是找代理建網站,python 做網站模塊星塵智能 全棧機器人工程師——Base深圳 職位描述 崗位職責 一、全鏈路機器人應用開發(fā) 負責從 應用層 →

2026/01/23 02:23:01

做微信掃碼網站產品介紹網站html

做微信掃碼網站,產品介紹網站html,wordpress點登錄鏈接重置,如何做網站診斷Wan2.2-T2V-A14B能否生成包含文字疊加的視頻片段#xff1f; 在數字內容爆炸式增長的今天#xff0c

2026/01/23 01:55:01

越南的網站建設google英文網站

越南的網站建設,google英文網站,三層別墅設計圖片大全 效果圖,網站建設公司長沙無線電系統(tǒng)和網絡中的光子學應用 1. 引言 在 2018 年至 2024 年期間,移動數據總流量將增長多達五倍,

2026/01/23 01:35:02