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

STL區(qū)間成員函數(shù)及區(qū)間算法總結(jié)

 更新時(shí)間:2015年07月01日 09:16:47   投稿:hebedich  
這篇文章主要匯總介紹了STL區(qū)間成員函數(shù)及區(qū)間算法,有需要的小伙伴可以參考下。

在這里總結(jié)下可替代循環(huán)的區(qū)間成員函數(shù)和區(qū)間算法;

相比單元素遍歷操作,使用區(qū)間成員函數(shù)的優(yōu)勢(shì)在于:
1)更少的函數(shù)調(diào)用
2)更少的元素移動(dòng)
3)更少的內(nèi)存分配

在區(qū)間成員函數(shù)不適用的情況下也應(yīng)該使用區(qū)間算法,至少,相比手寫循環(huán)而言,它更加簡(jiǎn)單,有效,并且不容易出錯(cuò);

區(qū)間成員函數(shù)

區(qū)間構(gòu)造

標(biāo)準(zhǔn)容器都支持區(qū)間構(gòu)造函數(shù):

復(fù)制代碼 代碼如下:

container::container(InputIterator begin, // 區(qū)間的起點(diǎn)
                  InputIterator end); // 區(qū)間的終點(diǎn)

例如:

復(fù)制代碼 代碼如下:

int myints[] = { 10, 20, 30, 30, 20, 10, 10, 20 };
std::vector<int> myvector (myints, myints+8);

以上是c++98中常用法,在C++11中,vector可以直接初始化了:

復(fù)制代碼 代碼如下:

std::vector<int> second ={10, 20, 30, 30, 20, 10, 10, 20}; 

或者:

復(fù)制代碼 代碼如下:

std::vector<int> second ({10, 20, 30, 30, 20, 10, 10, 20});  

區(qū)間插入

標(biāo)準(zhǔn)序列容器提供這種形式的insert:

復(fù)制代碼 代碼如下:

void container::insert(iterator position, // 區(qū)間插入的位置
                    InputIterator begin, // 插入?yún)^(qū)間的起點(diǎn)
                    InputIterator end); // 插入?yún)^(qū)間的終點(diǎn)

例如:

復(fù)制代碼 代碼如下:

int myints[] = { 10, 20, 30, 30, 20, 10, 10, 20 };
std::vector<int> myvector;
myvector.push_back(100);
myvector.insert(myvector.begin(),myints,myints+8); //10 20 30 30 20 10 10 20 100

關(guān)聯(lián)容器也支持區(qū)間插入,但由于其插入后的位置由其比較函數(shù)來(lái)決定,所以沒有區(qū)間插入的位置這個(gè)參數(shù);

區(qū)間刪除

標(biāo)準(zhǔn)序列容器提供的erase:

iterator container::erase(iterator begin, iterator end);

c++98的標(biāo)準(zhǔn)關(guān)聯(lián)容器提供的erase為:

void container::erase(iterator begin, iterator end);

序列容器調(diào)用erase之后,返回一個(gè)迭代器(被刪除的那個(gè)元素的下一個(gè)),
而關(guān)聯(lián)容器的erase刪除之后并不返回迭代器.【官方解釋說如果實(shí)現(xiàn)成序列容器那樣返回指向下一個(gè)迭代器,會(huì)導(dǎo)致無(wú)法接收的性能下降】;

這一區(qū)別在c++11中終于統(tǒng)一了;c++11中,對(duì)關(guān)聯(lián)容器調(diào)用erase之后會(huì)返回一個(gè)迭代器(指向被刪除元素的下一個(gè));

iterator container::erase(const_iterator first, const_iterator last);

區(qū)間賦值

所有標(biāo)準(zhǔn)容器提供了區(qū)間賦值的成員函數(shù):

void container::assign(InputIterator begin, InputIterator end);
這個(gè)函數(shù)用于給容器賦值,會(huì)替代現(xiàn)有值,并根據(jù)需要分配空間;
與copy()算法的區(qū)別在于它不需要預(yù)先分配空間,并有更高的性能;

復(fù)制代碼 代碼如下:

int myints[]={10,20,30,40,50,60,70};
std::vector<int> myvector;
myvector.assign(myints,myints+7);

通用區(qū)間算法

for_each 區(qū)間迭代

for_each:遍歷,對(duì)每個(gè)元素都執(zhí)行一個(gè)動(dòng)作;
C++98只支持最原始的for循環(huán),很多語(yǔ)言(java、python等)都實(shí)現(xiàn)了foreach區(qū)間迭代語(yǔ)法,這讓C++程序員眼饞了很久;
在沒有foreach區(qū)間迭代的時(shí)代,我們可以用for_each()算法來(lái)代替:

例:對(duì)每個(gè)元素都加5:

復(fù)制代碼 代碼如下:

void myfunction (int& i) {
    i += 5;
}
std::vector<int> myvector;
myvector.push_back(10);
myvector.push_back(20);
myvector.push_back(30);
for_each(myvector.begin(),myvector.end(),myfunction); //15 25 35

c++11中新增了區(qū)間迭代,使得我們對(duì)for_each的依賴降低了,使用也更加方便:

復(fù)制代碼 代碼如下:

for(auto &i : myvector )
{
    i+=5;
}

transform() 區(qū)間迭代后新值另存為其它地方

對(duì)區(qū)間中每個(gè)元素執(zhí)行操作后,將修改后的值寫入到新區(qū)間中;
可以認(rèn)為這個(gè)是for_each()算法不修改原區(qū)間的版本;
還是for_each中的例子:

復(fù)制代碼 代碼如下:

int addfunction(int i ){
    return i+5;
}
void output (int i) {  // output function
    std::cout << ' ' << i;
}
std::vector<int> myvector;
myvector.push_back(10);
myvector.push_back(20);
myvector.push_back(30);
std::vector<int> bvector;
bvector.resize(myvector.size());
transform(myvector.begin(),myvector.end(),bvector.begin(),addfunction);
//輸出
for_each(bvector.begin(),bvector.end(),output); //bvector: 15 25 35

copy() 區(qū)間復(fù)制

區(qū)間復(fù)制,一般用于多個(gè)容器間的數(shù)據(jù)傳值;
這個(gè)算法被用的很普遍,其實(shí),很多使用copy的場(chǎng)景,都可以使用區(qū)間成員函數(shù)來(lái)替代(也建議這么做);

例:復(fù)制數(shù)組到vector:

復(fù)制代碼 代碼如下:

int myints[]={10,20,30,40,50,60,70};
std::vector<int> myvector (7);
std::copy ( myints, myints+7, myvector.begin() );

fill() 區(qū)間填充

用一個(gè)元素來(lái)重復(fù)填充區(qū)間;
這個(gè)算法使用頻率較低;
例:用5填充vector前4個(gè)元素:

復(fù)制代碼 代碼如下:

std::vector<int> myvector (8);                       // myvector: 0 0 0 0 0 0 0 0
std::fill (myvector.begin(),myvector.begin()+4,5);   // myvector: 5 5 5 5 0 0 0 0

replace() 區(qū)間替換

遍歷區(qū)間,進(jìn)行值替換:
例:將以下區(qū)間中所有20替換為99:

復(fù)制代碼 代碼如下:

int myints[] = { 10, 20, 30, 30, 20, 10, 10, 20 };
std::vector<int> myvector (myints, myints+8);            // 10 20 30 30 20 10 10 20
std::replace (myvector.begin(), myvector.end(), 20, 99); // 10 99 30 30 99 10 10 99

更復(fù)雜的版本(使用仿函數(shù))replace_if
例:將以下區(qū)間中所有大于20替換為99:

復(fù)制代碼 代碼如下:

bool bigerThen20 (int i) { return i > 20; }
int myints[] = { 10, 20, 30, 30, 20, 10, 10, 20 };
std::vector<int> myvector (myints, myints+8);            // 10 20 30 30 20 10 10 20
std::replace_if (myvector.begin(), myvector.end(), bigerThen20, 99); //10 20 99 99 20 10 10 20

由于用到了仿函數(shù),通過replace_if實(shí)現(xiàn)的,用for_each()也很容易實(shí)現(xiàn);

remove() 區(qū)間刪除

從區(qū)間中刪除指定元素;

復(fù)制代碼 代碼如下:

int myints[] = { 10, 20, 30, 30, 20, 10, 10, 20 };
std::vector<int> myvector (myints, myints+8);            // 10 20 30 30 20 10 10 20
std::remove(myvector.begin(), myvector.end(), 20); // 10 30 30 10 10 ? ? ?

注意,remove并不會(huì)真正刪除元素,而只是將需要?jiǎng)h除的元素放到到最后,同時(shí)返回一個(gè)新的尾部迭代器,
比如,上述例子中,調(diào)用完remove后,vector中的值一般為 //10 30 30 10 10 10 10 20
而如果希望真的刪除元素,需要加上成員函數(shù)erase()來(lái)實(shí)現(xiàn)刪除 【remove-erase慣用法】:

復(fù)制代碼 代碼如下:

myvector.erase(std::remove(myvector.begin(), myvector.end(), 20),myvector.end()); // 10 30 30 10 10

unique() 區(qū)間去重

從區(qū)間中刪除相鄰相同的元素,同樣,這個(gè)算法也不會(huì)真正的刪除元素,而是將待刪除的元素移到區(qū)間尾部;
使用【unique-erase慣用法】:

復(fù)制代碼 代碼如下:

int myints[] = {10,20,20,20,30,30,20,20,10};           // 10 20 20 20 30 30 20 20 10
std::vector<int> myvector (myints,myints+9);
std::vector<int>::iterator it;
it = std::unique (myvector.begin(), myvector.end());   // 10 20 30 20 10 ?  ?  ?  ?
myvector.erase(it,myvector.end());

以上所述就是本文的全部?jī)?nèi)容了,希望大家能夠喜歡。

相關(guān)文章

  • 淺談VS中添加頭文件時(shí)顯示無(wú)法找到文件的問題

    淺談VS中添加頭文件時(shí)顯示無(wú)法找到文件的問題

    下面小編就為大家?guī)?lái)一篇淺談VS中添加頭文件時(shí)顯示無(wú)法找到文件的問題。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來(lái)看看吧
    2017-01-01
  • C指針原理教程之編譯原理-小型計(jì)算器實(shí)現(xiàn)

    C指針原理教程之編譯原理-小型計(jì)算器實(shí)現(xiàn)

    本文給大家分享的是如何使用C語(yǔ)言編寫一個(gè)小型計(jì)算器的實(shí)例代碼,有需要的小伙伴可以參考下
    2019-02-02
  • 一文搞懂C++中繼承的概念與使用

    一文搞懂C++中繼承的概念與使用

    我們都知道面向?qū)ο笳Z(yǔ)言的三大特點(diǎn)是:**封裝,繼承,多態(tài)。**之前在類和對(duì)象部分,我們提到了C++中的封裝,那么今天呢,我們來(lái)學(xué)習(xí)一下C++中的繼承
    2022-07-07
  • Qt 實(shí)現(xiàn)桌面雪花飄落代碼

    Qt 實(shí)現(xiàn)桌面雪花飄落代碼

    這篇文章主要介紹了Qt實(shí)現(xiàn)桌面雪花飄落代碼,有需要的朋友可以參考一下
    2013-12-12
  • Microsoft Visual Studio 2022的安裝與使用詳細(xì)教程

    Microsoft Visual Studio 2022的安裝與使用詳細(xì)教程

    Microsoft Visual Studio 2022是Microsoft Visual Studio軟件的一個(gè)高版本,能夠編寫和執(zhí)行C/C++代碼,具有強(qiáng)大的功能,是開發(fā)C/C++程序的主流軟件,這篇文章主要介紹了Microsoft Visual Studio 2022的安裝與使用詳細(xì)教程
    2024-01-01
  • C/C++宏替換實(shí)現(xiàn)詳解

    C/C++宏替換實(shí)現(xiàn)詳解

    這篇文章主要介紹了C/C++宏替換實(shí)現(xiàn)詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-11-11
  • vs2019中使用MFC構(gòu)建簡(jiǎn)單windows窗口程序

    vs2019中使用MFC構(gòu)建簡(jiǎn)單windows窗口程序

    今天發(fā)現(xiàn)網(wǎng)上好多MFC代碼都不能用,給大家分享一個(gè)簡(jiǎn)單的MFC窗口語(yǔ)言,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-06-06
  • QT實(shí)現(xiàn)簡(jiǎn)單打地鼠游戲

    QT實(shí)現(xiàn)簡(jiǎn)單打地鼠游戲

    這篇文章主要為大家詳細(xì)介紹了QT實(shí)現(xiàn)簡(jiǎn)單打地鼠游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-12-12
  • 判斷指定的進(jìn)程或程序是否存在方法小結(jié)(vc等)

    判斷指定的進(jìn)程或程序是否存在方法小結(jié)(vc等)

    VC判斷進(jìn)程是否存在?比如我想知道記事本是否運(yùn)行,要用到哪些函數(shù)等實(shí)例,需要的朋友可以參考下
    2013-01-01
  • C++之openFrameworks框架介紹

    C++之openFrameworks框架介紹

    本章我們將介紹一個(gè)非常好用的跨平臺(tái)的 C++開源框架 openFrameworks。它是一個(gè)開源的跨平臺(tái)的C++工具包,方便開發(fā)者創(chuàng)建出一個(gè)更簡(jiǎn)單和直觀的框架,擅長(zhǎng)開發(fā)圖像和動(dòng)畫,感興趣的同學(xué)可以參考一下
    2023-05-05

最新評(píng)論

百色市| 二手房| 巴林右旗| 江源县| 盐津县| 漳平市| 横峰县| 乌兰县| 丰城市| 合川市| 深水埗区| 石景山区| 通江县| 乌兰浩特市| 平顺县| 阜康市| 宜川县| 剑河县| 台东市| 常宁市| 丹东市| 大厂| 故城县| 景谷| 大英县| 平江县| 利川市| 湟中县| 灌云县| 镇远县| 遂宁市| 侯马市| 綦江县| 额敏县| 宁波市| 郸城县| 巫山县| 开江县| 武汉市| 阿勒泰市| 盱眙县|