STL源碼剖析 第二次溫習 細節審核

臨時對象的產生

  • 臨時對象也叫做 無名對象,(使用pass by value的方式會引發copy的操作,于是產生一個臨時的對象),造成效率的負擔,但是可以可以制造一些臨時對象
  • 在型別的后面 直接加上() 并可以指定初始數值,相當于調用型別的構造函數,但是不指定對象的名稱
  • 臨時對象一般常用于 仿函數和算法搭配上
  • 代碼如下所示? print<int>的臨時對象被傳入 for_each函數中起作用,當for_each結束的時候,臨時對象結束了他的生命
#include <vector>
#include <iostream>
#include <algorithm>template<typename T>
class print{
public:void operator()(const T&elem){  //operator 重載()std::cout <<elem << " ";}
};void print_function(int value){std::cout <<value << " ";
}int main(){int ia[6] = {0,1,2,3,4,5};std::vector<int>iv{ia,ia+6};std::for_each(iv.begin(),iv.end(),print<int>());    //使用模板類的方式
//    std::for_each(iv.begin(),iv.end(), print_function);}

靜態常量整數成員在class內部 直接初始化

#include <vector>
#include <iostream>
#include <algorithm>template<typename T>
class print{
public:void operator()(const T&elem){  //operator 重載()std::cout <<elem << " ";}
};void print_function(int value){std::cout <<value << " ";
}template <typename T>
class testClass{
public:static const T static_const_data_i = 5;static T static_data_i;
};//對于模板中使用static變量初始化,這段代碼不能省略 
template<typename T>
T testClass<T>::static_data_i = 0;int main(){testClass<int>temp;temp.static_data_i = 9;std::cout << testClass<int>::static_data_i << std::endl;std::cout << testClass<int>::static_const_data_i << std::endl;
}

遞增/遞減/解除引用 的運算符重載寫法

#include <vector>
#include <iostream>
#include <algorithm>class INT{friend std::ostream& operator<< (std::ostream& os,const INT& i);
public:INT(int i):m_i(i){};//prefix:increment and then fetchINT& operator++(){++(this->m_i); //隨著class的不同,這一行有不同的操作return *this;}const INT operator++(int){INT temp = *this;++(*this);return temp;}INT& operator--(){--(this->m_i);return *this;}const INT operator--(int){INT temp = *this;--(*this);return temp;}int & operator*() const{return (int &)m_i;}
private:int m_i;
};std::ostream& operator<<(std::ostream& os,const INT& i){os << '[' << i.m_i << ']' << " ";return os;
}int main(){INT I(5);std::cout << I++ ;// [5]std::cout << ++I; // [7]std::cout << I--; // [7]std::cout << --I; // [5]std::cout << *I;  //  5
}

前閉后開 區間表示法

  • STL算法需要使用一對迭代器(泛型指針)表示 區間,也就是操作的的范圍,使用[first.,last)來表示;實際的范圍是first 開始 到 last-1結束?
  • last指代的是 最后一個元素的下一個位置?
  • 使用的是 偏移一格 的標示法
template<class InputIterator,class T>
InputIterator find(InputIterator first,InputIterator last,const T& value){while(first != last && *first != value){++first;}return value;
}template<class InputIterator,class Function>
Function for_each(InputIterator first,InputIterator last,Function f){for (; first != last; ++first) {f(*first);}return f;
}

?函數回調 操作符( function call)

  • 函數調用操作(也就是左括號和右括號)? 也可以被重載
  • STL算法 提供了兩個版本,一個用于一般情況(比如按照遞增序列進行排序)? ;一個用于特殊情況(按照用戶指定的規則進行排序);用戶指定的規則 是通過函數進行制定的
  • 先前 C語言時代 如果想將函數作為參數進行傳遞? 只能使用函數指針的方式
#include <vector>
#include <iostream>
#include <algorithm>int fcmp(const void* elem1,const void* elem2){const int* i1 = (const int*) elem1;const int* i2 = (const int*) elem2;if (*i1 < *i2){return -1;}else if(*i1 == *i2){return 0;}elsereturn 1;}int main(){int ia[10] = {32,92,67,58,10,4,25,52,59,54};for (int i = 0; i < 10; ++i) {std::cout << ia[i] << " ";}qsort(ia,sizeof(ia)/sizeof (int), sizeof (int),fcmp);std::cout << std::endl;for (int i = 0; i < 10; ++i) {std::cout << ia[i] << " ";}
}
  • 函數指針有缺陷 無法維持自己的狀態? 也無法達到組件技術中的 可適配性,也就是無法再將 某些裝飾條件 加諸其上而改變其狀態
  • 因此STL使用仿函數的形式實現了所謂的策略,仿函數類似于函數,比如針對某個類的進行operator()重載 就成為了仿函數,如果需要將其轉換為可配接的仿函數需要額外的努力
  • 這個例子 缺乏 可配接能力 的體現? 將在第8章 詳述
#include <vector>
#include <iostream>
#include <algorithm>//由于將operator()重載了 因此plus成為了一個仿函數
template <class T>
struct plus{T operator()(const T& x,const T& y)const{return x+y;}
};//由于將operator()重載了 因此minus成為了一個仿函數
template <class T>
struct minus{T operator()(const T& x,const T& y)const{return x-y;}
};int main(){//產生仿函數對象plus<int>plus_obj;minus<int>minus_obj;//以下使用仿函數就像使用一般函數一樣std::cout << plus_obj(3,67) << std::endl;std::cout << minus_obj(67,3) << std::endl;//以下直接產生函數的臨時對象(第一對小括號) 并進行調用(第二隊小括號)//使用括號產生臨時對象std::cout << plus<int>()(3,67) <<std::endl;std::cout << minus<int>()(67,3) << std::endl;
}

參考鏈接

  • c++類模板遇上static關鍵字_宿罪的博客-CSDN博客_static 模板
  • c++中ostream類的超詳細說明 - 知乎

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

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

相關文章

java 彩票游戲

題目 Math.random()獲取隨機數 Math.random()返回的是一個[0.0,1.0)的doule類型的數 所以&#xff0c;獲取0-9&#xff1a;(int)Math.random()*10–> [0,10) 獲取0-10&#xff1a;(int)Math.random()*101–> [0,11) 獲取10-99&#xff1a;(int)Math.random()9010–> […

python異常處理_Python入門 斷言與異常處理

一、斷言斷言&#xff0c;可以理解為判斷是否斷開的預言。assert 表達式 , 描述表達式為我們的預期結果&#xff0c;當表達式的結果為False時&#xff0c;拋出 AssertionError 異常&#xff0c;如無異常捕獲程序遇到異常時直接結束運行。反之&#xff0c;表達式結果為True 程序…

C++ 左值和右值 的學習

引用是一個變量&#xff0c;它引用其他變量的內存位置 int x 34; int &lRef x; 標識符 IRef 就是一個引用。在聲明中&#xff0c;引用是通過 & 來指示的&#xff0c;出現在類型與變量的標識符之間&#xff0c;這種類型的引用稱為左值引用左值看作是一個關聯了名稱的…

百度關鍵詞排名查詢源碼_章丘百度霸屏總部,關鍵詞排名騰沃云

上海保沃騰沃云為您詳細解讀URiIr章丘百度霸屏總部的相關知識與詳情&#xff0c;做網站SEO優化文章內容優化效果已經十分明顯。內容的量量關于網站的整體量量很重要。通過關鍵字闡發&#xff0c;陳某們曉得需要環繞關鍵字編寫網頁。使您的內容的重要根底是您對網頁籌算描述的賣…

java 結婚問題

題目 大家都知道&#xff0c;男大當婚&#xff0c;女大當嫁。那么女方家長要嫁女兒&#xff0c;當然要提出 一定的條件&#xff1a;高&#xff1a;180cm以上&#xff1b;富&#xff1a;財富1千萬以上&#xff1b;帥&#xff1a;是。 如果這三個條件同時滿足&#xff0c;則&…

密碼學專題 數據填充的方式|序列加密的方式

電子密碼本模式和加密分組鏈接模式的分組算法都要求加密輸入的分組是固定長度 的&#xff0c;但是大多數輸入明文可能都不是分組長度的整數倍&#xff0c;也就是說&#xff0c;最后一個分組一般來 說是不足一個分組長度的。為了使分組加密算法能夠正常工作&#xff0c;通常使用…

win10此電腦不見了_教程 | win10總提示“你要允許此應用對電腦的修改嗎”,如何關閉?...

在使用電腦的時候&#xff0c;你是否曾遇到過這樣的情況&#xff0c;點擊打開軟件的時候&#xff0c;系統總是提示我們“你要允許此應用對你的設備進行修改嗎&#xff1f;”難道是軟件中病毒了嗎&#xff1f;&#xff0c;這其實上并沒有什么用處&#xff0c;只是系統無法判斷軟…

java 小時轉換為xx天xx小時

題目 為抵抗洪水&#xff0c;戰士連續作戰89小時&#xff0c;編程計算共多少天零多少小時&#xff1f; 代碼 使用/與% class ExchangeTime {public static void main(String[] args) {/*為抵抗洪水&#xff0c;戰士連續作戰89小時&#xff0c;編程計算共多少天零多少小時&a…

密碼學專題 加密模式的選擇|傳輸數據加密

分組加密模式和序列加密模式。它們之間最大的區 別在于分組加密模式每次對一組數據進行加密運算處理&#xff0c;而序列加密模式則逐位對數據進 行加密運算處理。事實上&#xff0c;在實際設計應用的算法中&#xff0c;并沒有那么嚴格的區別&#xff0c;它們有可能是相互結合的…

微信公眾號數據2019_2019年9月原創公眾號排行榜數據報告出爐

西瓜數據發布 2019 年 9 月原創公眾號排行榜&#xff0c;分別從西瓜指數、原創文章占比、周期內公眾號發文次數、發文篇數、總閱讀數、頭條平均閱讀數等方面展示公眾號數據。榜單說明1、涉及榜單本期月榜截取 ①財經、②教育、③娛樂、④科技、⑤體育、⑥游戲、⑦文化、⑧美食、…

java 求100天之后是周幾

題目 今天是周二&#xff0c;100天以后是周幾&#xff1f; 代碼 代碼1&#xff1a;減去天數&#xff0c;使循環從周一開始 //方法1&#xff1a;減去天數&#xff0c;使循環從周一開始int today2;//7天一個循環&#xff1a;3 4 5 6 7 1 2 3 4 5 6 7int after100;//(100-5)%…

密碼學專題 OpenSSL專題

OpenSSL總體架構 軟件包分為三個主要的功能部分&#xff1a;密碼算法庫 、 SSL協議庫及應用程序 MacOS&#xff0c;MS&#xff0c;OS/2及 VMS這幾個目錄&#xff0c;包含了在不同的 平臺編譯時的環境變量配置文件&#xff0c;在安裝編譯完成之后&#xff0c;這幾個目錄就沒有作…

java 華氏溫度轉換為攝氏溫度

題目 小明要到美國旅游&#xff0c;可是那里的溫度是以華氏度為單位記錄的。 它需要一個程序將華氏溫度&#xff08;80度&#xff09;轉換為攝氏度&#xff0c;并以華氏度和攝氏度為單位分別顯示該溫度。 公式&#xff1a;華氏溫度&#xff08;攝氏溫度-32&#xff09;/1.8 M…

hs控什么意思_凡爾賽文學 到底是什么?

點擊藍字關注我們XIE XIE NI DE XI HUAN|| 動漫 情頭 耽美 閨蜜 男女頭 句子控 壁紙 ||左句 凡爾賽文學野象&#xff1a;老是有人提知不知道凡爾賽文學&#xff0c;說實話我不太清楚網絡時下流行的梗&#xff0c;也沒有興趣參與&#xff0c;我還是比較喜歡歐洲古典文學和后現…

密碼學專題 openssl編譯和安裝

Configure 腳本文件 使得OpenSSL可以適應多種不同的系統平臺和多達幾十種不同的編譯器。Configure指令還可以使OpenSSL在編譯的時候具備組件的選擇功能&#xff0c;比如可以選擇支持或者不支持某種算法或者協議等&#xff0c;這使得OpenSSL具有很大的靈活性&#xff0c;比如在…

Python學習12 文件的讀寫

目標 文件的打開和關閉 mode缺省情況下表示只讀r 文件的路徑 前面加個r’,代表其中的轉義字符不起作用 文件的打開方式 案例&#xff1a;實現文件拷貝的功能 將某一文件夾下的某一文件 保存在當前文件 所在目錄。 import os #讀取文件1 path./file.txt fileopen(path,…

密碼學專題 openssl的基本概念

配置文件 配置文件是OpenSSL的一個基礎結構組件&#xff0c;OpenSSL使用一組稱為OpenSSLCONF的函數來讀取OpenSSL配置文件的信息。OpenSSL提供的主配置文件是opensl.cnf&#xff0c;它集成了OpenSSL所要使用的配置文件選項的大部分內容。此外&#xff0c;OpenSSL還提供了其他一…

該工程中的宏被禁止_建筑勞務分包都能承擔什么工程

來源&#xff1a;找法網建筑工程的承包單位&#xff0c;也就是總承包單位可以將部分建造工程分包給具有資質的施工單位&#xff0c;這是法律所允許的&#xff0c;但是禁止將建造工程進行轉包。一、建筑勞務分包都能承擔什么工程建筑勞務分包能承擔什么工程要看分包單位的資質&a…

python實驗練習-類的多繼承

題目 1、概述&#xff1a; 完成學生&#xff0c;組長&#xff0c;教師的設計與實現。 2、具體實現內容&#xff1a; 學生&#xff1a; 姓名&#xff0c; 年齡&#xff0c; 學號 吃飯&#xff0c; 睡覺&#xff0c; 學習 組長&#xff1a; 姓名&#xff0c; 年齡&#xff0c; 學…

matlab用辛普森公式求積分_積分近似計算之辛普森公式

對于積分區間[a, b]&#xff0c;若則成立辛普森公式辛普森公式可看作是改良的梯形公式。梯形公式是以直線逼近實際曲線&#xff0c;而辛普森公式則以二次曲線(即拋物線)逼近。以二次曲線逼近實際曲線根據辛普森公式可得各積分小區間內的積分值如下式所示&#xff1a;其中于是&a…