最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++ primer超詳細(xì)講解泛型算法

 更新時(shí)間:2022年07月01日 09:44:14   作者:撲街男孩  
泛型編程,故如其名,是一個(gè)泛化的編程方式。其實(shí)現(xiàn)原理為程序員編寫一個(gè)函數(shù)/類的代碼示例,讓編譯器去填補(bǔ)出不同的函數(shù)實(shí)現(xiàn)

初識(shí)泛型算法

只讀算法

只讀取輸入范圍內(nèi)的函數(shù),不改變?cè)?,find,accumula也是如此

(1)accumulate算法為求和算法,前兩個(gè)參數(shù)指出求和元素范圍,第三個(gè)是和的初值,例:

int sum=accumulate(v.begin(),v.end(),0)

(2)操作兩個(gè)序列的算法

equal算法,確定兩個(gè)序列是否保存相同的值,將第一個(gè)序列的每個(gè)元素和第二個(gè)序列中的每個(gè)元素進(jìn)行比較,若相同返回true,否則返回false,接受三個(gè)參數(shù),前兩個(gè)表示第一個(gè)序列的元素范圍,第三個(gè)表示第二個(gè)序列的首元素

equal(r1.begin(),r1.end(),r2.begin())

寫容器算法

(1)拷貝算法

向另一個(gè)目的位置迭代器指向的輸出序列中的元素寫入數(shù)據(jù)算法。此算法接受三個(gè)迭代器,前兩個(gè)表示一個(gè)舒服范圍,第三個(gè)表示目的序列的起始位置。copy返回目的迭代器的值。

int a1[] = { 0,1,2,3,4,5 };
int a2[sizeof(a1) / sizeof(*a1)];
auto ret = copy(begin(a1), end(a1), a2);

定制操作

lambda表達(dá)式

(1)定義

一個(gè)lambda表達(dá)式表示一個(gè)可調(diào)用的代碼單元,可理解為未命名的內(nèi)聯(lián)函數(shù)

lambda表達(dá)式形式:

[capture list](parameter list) - > return type{function body}

可以忽略參數(shù)列表和返回類型,但必須永遠(yuǎn)包含捕獲列表和函數(shù)體

auto f =[] {return 42}

調(diào)用: cout<<f()<<endl;

(2)向lambda傳遞參數(shù)

實(shí)參被用來(lái)初始化lambda的形參,lambda不能有默認(rèn)參數(shù)

例:

//[](const string &a,const string &b){return a.size()<b.size()}
//調(diào)用
sort(w.begin(),w.end(),[](const string &a,const string &b){return a.size()<b.size()})

(3)使用捕獲列表

一個(gè)lambda通過(guò)將局部變量包含在其捕獲列表中指出將會(huì)使用這些變量,捕獲列表指引lambda在其內(nèi)部包含訪問(wèn)局部變量所需的全部信息

例如,找出第一個(gè)大于等于給定長(zhǎng)度的單詞。

函數(shù)biggies實(shí)現(xiàn)

void biggies(vector<string> &words,vector<string>::size_type sz)
{
    auto wc=find_if(words.begin(),words.end(),
                    [sz](const string &a){return a.size()>=sz});
}

lambda捕獲和返回

(1)值捕獲

與傳值參數(shù)類似,采用值捕獲的前提是變量可以拷貝,與參數(shù)不同,被捕獲的變量的值是在lambda創(chuàng)建時(shí)拷貝,而不是調(diào)用時(shí)拷貝

void fcun()
{
    size_t v1=42;
    auto f=[v1]{return v1;};
    v1=0;
    auto j=f();
}

由于被捕獲變量的值是在lambda創(chuàng)建時(shí)拷貝,因此隨后對(duì)其修改不會(huì)影響到lambda內(nèi)對(duì)應(yīng)的值,上述中j的值為42

(2)引用捕獲

void fcun()
{
    size_t v1=42;
    auto f=[&v1]{return v1;};
    v1=0;
    auto j=f();   //j為0,f2保存v1的引用,而非拷貝
}

(3)隱式捕獲

可以讓編譯器根據(jù)lambda體中的代碼推斷我們要使用哪些變量,此時(shí)應(yīng)在捕獲列表中寫一個(gè)&或=,&表示采用捕獲引用,=表示采用值捕獲方式。

wc=find_if(w.begin(),w.end(),[=](const string &s){return s.size>=sz;});

(4)可變lambda

在值拷貝的情況下,lambda不會(huì)改變其值,若希望能夠改變被捕獲的變量的值,則在參數(shù)列表首加上mutable關(guān)鍵字。

void func()
{
    size_t v1=42;
    auto f=[vi]() mutable{return ++v1;};
    v1=0;
    auto j=f();
}

一個(gè)引用捕獲的變量能否可以修改依賴于此引用指向的是一個(gè)const還是非const類型

void fc()
{
	const size_t v1 = 42;
	auto f = [&v1]() mutable {return ++v1; };//無(wú)法修改v1
	auto j = f();
	cout << j << endl;
}

(5)指定lambda的返回類型

默認(rèn)情況下,如果一個(gè)lambda體中包含return之外的任何語(yǔ)句,則編譯器假定此lambda返回void。

例如:將一個(gè)序列中負(fù)數(shù)替換為其絕對(duì)值

transform(v.begin(),v.end(),v.begin(),[](int i){return i<0?-i:i;})

transform接受三個(gè)參數(shù),前兩個(gè)表示迭代器輸入序列,第三個(gè)表示迭代器目的位置。

上述中,我們無(wú)需指定返回類型,因此可以根據(jù)條件運(yùn)算符的類型推斷出來(lái)。

若改寫成存在if語(yǔ)句,則存在錯(cuò)誤

transform(v.begin(),v.end(),v.begin(),[](int i){if(i<0) return -i; else return i;})

編譯器發(fā)現(xiàn)存在return之外的語(yǔ)句,所以推斷其返回類型為void,而他卻返回了一個(gè)int

正確寫法:

transform(v.begin(),v.end(),v.begin(),
                [](int i) ->int {if(i<0) return -i; else return i;})

再探迭代器

標(biāo)準(zhǔn)庫(kù)頭文件iterator中還定義了額外幾種迭代器,包括如下:

  • 插入迭代器:綁定到一個(gè)容器上,向容器插入元素
  • 流迭代器:綁定到輸入輸出流上,可以用來(lái)遍歷所關(guān)聯(lián)的IO流
  • 反向迭代器:這些迭代器向后而不是向前移動(dòng),forwar_list不存在此迭代器
  • 移動(dòng)迭代器:移動(dòng)元素專用

插入迭代器

例:

list<int> lst = { 1,2,3,4 };
list<int> lst2, lst3;
copy(lst.begin(), lst.end(), front_inserter(lst2));
copy(lst.begin(), lst.end(), inserter(lst3, lst3.begin()));

front_inserter總是插入容器的第一個(gè)元素之前,所以lst2中的元素順序?yàn)?,3,2,1,而lst3中的元素順序?yàn)?,2,3,4

iostream迭代器

istream_iterator讀取輸入流,ostream_iterator向一個(gè)輸出流寫數(shù)據(jù)。

(1)istream_iterator操作

創(chuàng)建流迭代器時(shí),必須指定迭代器將要讀寫的對(duì)象類型,可以創(chuàng)建空的初始化迭代器,用作尾后值使用的迭代器,一旦關(guān)聯(lián)的流遇到文件尾或者IO錯(cuò)誤,迭代器的值就與尾后迭代器相等。

例:讀取輸入數(shù)據(jù)保存到vector中

vector<int> v;
istream_iterator<int> it(cin);
istream_iterator<int> e;
while (it != e)
    v.push_back(*it++);   //或 v.push_back(it,e)

(2)使用算法操作流迭代器

例:

istream_iterator<int> it(cin);
istream_iterator<int> e;
cout << accumulate(it, e, 0) << endl;

(3)ostream_iterator操作

創(chuàng)建一個(gè)ostream_iterator時(shí),可以提供第二參數(shù),他是一個(gè)字符串,在輸出每個(gè)元素后都會(huì)打印此字符串,不允許空的或表示尾后的ostream_iterator

vector<int> v = { 1,2,3,4 };
ostream_iterator<int> out(cout, "@@");
for (auto e : v)
	*out++ = e;  //賦值語(yǔ)句實(shí)際上是將元素寫到cout,且*和++并不做任何事
cout << endl;

反向迭代器

反向迭代器就是在容器中尾元素向首元素反向移動(dòng)的迭代器,遞增一個(gè)反向迭代器會(huì)向前移動(dòng)一個(gè)元素,遞減一個(gè)迭代器會(huì)向后移動(dòng)一個(gè)元素

將反向迭代器轉(zhuǎn)換為普通迭代器可使用reverse_iterator中的base成員函數(shù)來(lái)完成轉(zhuǎn)換

例:輸出最后一個(gè)單詞

string line = { "first,middle,last" };
auto r = find(line.rbegin(), line.rend(), ',');
cout << string(r.base(), line.end()) << endl;

到此這篇關(guān)于C++ primer超詳細(xì)講解泛型算法的文章就介紹到這了,更多相關(guān)C++ primer泛型算法內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • QT窗口/控件置頂方法舉例詳解

    QT窗口/控件置頂方法舉例詳解

    我們使用QT進(jìn)行界面開(kāi)發(fā)時(shí),可能會(huì)遇到需要將窗口置頂?shù)那闆r,下面這篇文章主要給大家介紹了關(guān)于QT窗口/控件置頂方法的相關(guān)資料,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2024-01-01
  • 利用反射獲得類的public static/const成員的值實(shí)例

    利用反射獲得類的public static/const成員的值實(shí)例

    下面小編就為大家?guī)?lái)一篇利用反射獲得類的public static/const成員的值實(shí)例。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2016-12-12
  • C++11中條件標(biāo)量和互斥鎖應(yīng)用出現(xiàn)死鎖問(wèn)題

    C++11中條件標(biāo)量和互斥鎖應(yīng)用出現(xiàn)死鎖問(wèn)題

    這篇文章主要介紹了C++11中條件標(biāo)量和互斥鎖應(yīng)用出現(xiàn)死鎖思考,本文通過(guò)示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-06-06
  • 基于C++17實(shí)現(xiàn)的手寫線程池

    基于C++17實(shí)現(xiàn)的手寫線程池

    本文主要介紹了基于C++17實(shí)現(xiàn)的手寫線程池,自己實(shí)現(xiàn)了Any類,Semaphore類以及Result類的開(kāi)發(fā),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2024-08-08
  • 基于Qt開(kāi)發(fā)獲取CTP量化交易接口測(cè)試數(shù)據(jù)工具

    基于Qt開(kāi)發(fā)獲取CTP量化交易接口測(cè)試數(shù)據(jù)工具

    這篇文章主要為大家詳細(xì)介紹了如何使用Qt軟件開(kāi)發(fā)K線股P相關(guān)軟件,先開(kāi)發(fā)一個(gè)通過(guò)CTP量化交易的sdk獲取相關(guān)推送數(shù)據(jù)的工具,需要的可以參考下
    2024-04-04
  • 實(shí)現(xiàn)一個(gè)內(nèi)存池管理的類方法

    實(shí)現(xiàn)一個(gè)內(nèi)存池管理的類方法

    下面小編就為大家?guī)?lái)一篇實(shí)現(xiàn)一個(gè)內(nèi)存池管理的類方法。小編覺(jué)得挺不錯(cuò)的現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-01-01
  • openCV4.1.1+VS2019環(huán)境配置詳解

    openCV4.1.1+VS2019環(huán)境配置詳解

    這篇文章主要介紹了openCV4.1.1+VS2019環(huán)境配置詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-08-08
  • C++智能指針weak_ptr的作用詳解

    C++智能指針weak_ptr的作用詳解

    weak_ptr是一個(gè)智能指針,也是一個(gè)類模板,本文主要介紹了C++智能指針weak_ptr的作用詳解,具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-08-08
  • 詳解C語(yǔ)言的void*空指針

    詳解C語(yǔ)言的void*空指針

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言的void*空指針,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助
    2022-03-03
  • 詳解C++程序中定義struct結(jié)構(gòu)體的方法

    詳解C++程序中定義struct結(jié)構(gòu)體的方法

    C++中同樣擁有C語(yǔ)言中的結(jié)構(gòu)體,下面就來(lái)詳解C++程序中定義struct結(jié)構(gòu)體的方法,需要的朋友可以參考下
    2016-05-05

最新評(píng)論

收藏| 资溪县| 靖远县| 江都市| 即墨市| 咸阳市| 锦州市| 德保县| 荥经县| 霞浦县| 长春市| 故城县| 皋兰县| 长武县| 龙岩市| 平遥县| 大丰市| 府谷县| 郓城县| 塔城市| 江达县| 济南市| 山东| 凤凰县| 绥中县| 华池县| 班戈县| 兰考县| 芦山县| 黑山县| 高州市| 武义县| 宁武县| 文昌市| 万年县| 田阳县| 白朗县| 循化| 四会市| 若尔盖县| 扎鲁特旗|