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

C++STL教程之vector模板的使用

 更新時(shí)間:2022年08月22日 08:43:35   作者:Shawn-Summer  
模板類vector是一個(gè)動(dòng)態(tài)數(shù)組,類似于string類,可存放任意類型,能夠末尾、中間增加數(shù)據(jù),基本上是是new創(chuàng)建動(dòng)態(tài)數(shù)組的替代品,vector可以自動(dòng)完成new和delete

vector模板類

STL(標(biāo)準(zhǔn)模板庫)提供了容器、迭代器、函數(shù)對(duì)象、算法的模板。容器是類似于數(shù)組的東西,它可以存儲(chǔ)若干值,STL容器是同質(zhì)的,即存儲(chǔ)的值的類型相同;迭代器是用來遍歷容器的,它和能遍歷數(shù)組的指針類似,是廣義指針;函數(shù)對(duì)象是類似于函數(shù)的對(duì)象,可以是類對(duì)象和函數(shù)指針;算法就是一些能完成特定任務(wù)的處方。

我們來看最簡單的容器:vector模板類。

1. vector模板類

1.1 創(chuàng)建模板類

在頭文件vector中定義了vector模板,我們稱之為矢量,它就像是加強(qiáng)版的數(shù)組。

創(chuàng)建vector模板對(duì)象:

std::vector<int> first;                                // empty vector of ints
std::vector<int> myadd(5);                             //vector of five ints
std::vector<int> second (4,100);                       // four ints with value 100
std::vector<int> third (second.begin(),second.end());  // iterating through second
std::vector<int> fourth (third);                       // a copy of third

一般來說,我們使用前三種方式初始化vector對(duì)象,創(chuàng)建好了后數(shù)組可以做的它都可以,例如我們可以使用[]隨機(jī)訪問數(shù)據(jù)。

矢量模板類還支持列表初始化語句

std::vector<int> a{1,2,3,4,5};

1.2 STL容器都提供的成員方法

  • size():返回容器中元素?cái)?shù)目
  • swap():交換兩個(gè)容器的內(nèi)容
  • begin():返回一個(gè)指向容器第一個(gè)元素的迭代器
  • end():返回一個(gè)表示超過容器尾的迭代器

什么是迭代器?它是一個(gè)廣義指針。它可以是指針,也可以是一個(gè)可對(duì)其執(zhí)行–解除引用operator*()和遞增operator++()–的對(duì)象。每一個(gè)容器類都定義了一個(gè)合適的迭代器,它的類型是一個(gè)名為iteratortypedef,其作用域是整個(gè)類。

我們可以這樣聲明一個(gè)迭代器:
vector<double>::iterator pd;
也可以使用auto關(guān)鍵字:
auto pd=scores.begin();
我們可以使用迭代器pd進(jìn)行如下操作:

pd=scores.begin();
*pd=22.3;
++pd;
pd++;
--pd;
pd--;

總之迭代器就相當(dāng)于是指向容器中元素的指針。

什么是超過結(jié)尾(past-the-end)?它是一種迭代器,指向容器中最后一個(gè)元素后面那個(gè)元素。例如在C風(fēng)格字符串中,字符串的末尾的\0就是超過結(jié)尾指向的元素。end()成員函數(shù)會(huì)返回超過結(jié)尾迭代器。
那么我們的遍歷可以這樣寫:

for(pd=scores.begin();pd!=scores.end(),pd++)
    cout<<*pd;
#include<vector>
#include<iostream>
int main()
{
    using std::cout;
    using std::endl;
    using std::vector;
    vector<double> a{1,2,3,4,5};
    vector<double> b{6,7,8};
    cout<<"a size: "<<a.size()<<endl;
    cout<<"b size: "<<b.size()<<endl;
    cout<<"a :";
    for(vector<double>::iterator i=a.begin();i!=a.end();i++)
        cout<<*i<<" ";
    cout<<"\nb :";
    for(vector<double>::iterator i=b.begin();i!=b.end();i++)
        cout<<*i<<" ";
    a.swap(b);
    cout<<"\nafter swap:"<<endl;
    cout<<"a :";
    for(vector<double>::iterator i=a.begin();i!=a.end();i++)
        cout<<*i<<" ";
    cout<<"\nb :";
    for(vector<double>::iterator i=b.begin();i!=b.end();i++)
        cout<<*i<<" ";
}

a size: 5
b size: 3
a :1 2 3 4 5
b :6 7 8
after swap:
a :6 7 8
b :1 2 3 4 5

以上代碼是測試了,矢量類的一些接口

實(shí)際上還有很多接口:例如empty,front,back;可以直接看cplusplus

1.3 vector特有的成員方法

  • push_back():將元素添加到矢量末尾,而且矢量長度會(huì)自動(dòng)增大
  • erase():刪除給定區(qū)間內(nèi)的元素
  • insert():插入指定區(qū)間內(nèi)的元素

push_back()接受一個(gè)元素類型的參數(shù),它相當(dāng)于在矢量的超過末尾的地方加個(gè)元素:

vector<double> scores;
double temp=1.23;
scores.push_back(temp);

erase()接受兩個(gè)迭代器參數(shù),這兩個(gè)迭代器定義了要?jiǎng)h除的區(qū)間,第一個(gè)迭代器是區(qū)間起始處,第二個(gè)迭代器是區(qū)間終止后的第一個(gè)位置,例如a.erase(start,end);是指刪除區(qū)間[start,end)左開右閉中的元素,而C++中所說的區(qū)間都是這種左開右閉的區(qū)間。

scores.erase(scores.begin(),scores.begin()+2);

上面這句代碼就會(huì)刪除矢量對(duì)象中前兩個(gè)元素。

insert()會(huì)把指定區(qū)間里的元素插到一個(gè)位置前面。它接受三個(gè)迭代器參數(shù),第一個(gè)參數(shù)指出新元素的插入位置,第二第三就是區(qū)間;

vector<int> old_v;
vector<int> new_v;
...
old_v.insert(old_v.begin(),new_v.begin()+1,new_v.end());

上面這段代碼會(huì)把new_v中除了第一個(gè)元素外的所有元素插到old_v的第一個(gè)元素的前面。

超尾元素的存在,使得在最后一個(gè)元素后面插入元素變得簡單:

old_v.insert(old_v.end(),new_v.begin()+1,new_v.end());

#include<vector>
#include<iostream>
int main()
{
    using namespace std;
    vector<int> a;
    a.push_back(1);
    a.push_back(2);
    cout<<"a: ";
    for(auto i=a.begin();i!=a.end();i++)
    cout<<*i;
    cout<<endl;
    vector<int>b{3,4,5,6,7};
    a.insert(a.end(),b.begin(),b.begin()+3);
    cout<<"after insert: ";
    cout<<"a: ";
    for(auto i=a.begin();i!=a.end();i++)
    cout<<*i;
    cout<<endl;
    a.erase(a.begin()+1,a.begin()+3);
    cout<<"after erase: ";
    cout<<"a: ";
    for(auto i=a.begin();i!=a.end();i++)
    cout<<*i;
    cout<<endl;
}

a: 12
after insert: a: 12345
after erase: a: 145   

1.4 STL容器的非成員方法

我們會(huì)對(duì)容器做很多操作,例如搜索,排序。但是這些功能不會(huì)放在成員方法中,因?yàn)椴煌娜萜黝惖呐判蚧蛘咚阉鞣椒ǘ际穷愃频?所以我們?yōu)榱斯?jié)省代碼,就不會(huì)為每個(gè)容器單獨(dú)寫這種成員方法。但是,即使存在執(zhí)行相同任務(wù)的非成員函數(shù),STL容器可能也會(huì)定義相同的成員方法,例如vectorswap()成員方法比swap()非成員方法效率高,但是非成員函數(shù)讓您可以交換兩個(gè)不同類型的容器的內(nèi)容。

  • for_each():遍歷
  • random_shuffle():隨機(jī)排列
  • sort():排序

這些方法都定義在頭文件algorithm中,這就是我們所說的算法。
for_each()接受3個(gè)參數(shù),前兩個(gè)是定義區(qū)間的迭代器,最后一個(gè)是指向函數(shù)的指針(或者說是函數(shù)對(duì)象)。for_each()將被指向的函數(shù)應(yīng)用于容器間的各個(gè)元素。但是for_each()不能修改容器的元素值。我們可以使用它來代替for循環(huán)。

for_each(books.begin(),books.end(),foo);//foo是函數(shù)名,即函數(shù)地址

這個(gè)語法很熟悉,很像基于范圍的for循環(huán):

double prices[5]={4.99,10.99,6.87,7.99,8.49};
for(double x:prices)
    cout<<x<<endl;
for_each(books.begin(),books.end(),foo);//foo是函數(shù)名,即函數(shù)地址
//等價(jià)于
for(auto x:books) foo(x);

但是基于范圍的for循環(huán)可以改變?nèi)萜鞯膬?nèi)容,我們只需要函數(shù)的參數(shù)是引用參數(shù)foo(int &);
然后我們的代碼:

for(auto &x:books) foo(x);

random_shuffle()接受兩個(gè)指定區(qū)間的迭代器,并隨機(jī)排列區(qū)間中的元素,但是random_shuffle()要求容器允許隨機(jī)訪問(即使用books[i]可以直接訪問元素)

random_shuffle(books.begin(),books.end());

sort()也要求容器支持隨機(jī)訪問
第一個(gè)版本的sort()接受兩個(gè)指定區(qū)間的迭代器,并且使用<運(yùn)算符對(duì)容器中的元素進(jìn)行升序排列:

vector<int> coolstuff;
...
sort(coolstuff.begin(),coolstuff.end());

這就意味著,如果容器中的元素的類型必須定義operator<()。

第二個(gè)版本的sort()接受三個(gè)參數(shù),它更實(shí)用,前兩個(gè)參數(shù)是指定區(qū)間的迭代器,第三個(gè)參數(shù)是函數(shù)指針(或函數(shù)對(duì)象)。這個(gè)函數(shù)指針指向一個(gè)返回bool值,接受兩個(gè)元素的函數(shù),如果true就說明排序正確,如果false就說明排序錯(cuò)誤。

例如我們希望采用降序排列:

bool compare(double db1,double db2)
{
    if(db1<db2)
        return false;
    else 
        return true;
}
int main(){
vector<double> a{4.99,10.99,6.87,7.99,8.49};
sort(a.begin(),a.end(),compare);
}

或者直接使用函數(shù)對(duì)象:

sort(a.begin(),a.end(),greater<double>());

這里使用的greater<double>()就是函數(shù)對(duì)象,它返回了double類型的大于運(yùn)算。

#include<vector>
#include<iostream>
#include<algorithm>
void show(const int &a)
{
    std::cout<<a<<" ";
}
bool greater(const int &x,const int &y)
{
    return x>y;
}
int main()
{
    using std::vector;
    using std::random_shuffle;
    using std::sort;
    using std::for_each;
    using std::cout;
    vector<int> a;
    for(int i=0;i<20;i++)
        a.push_back(i);
    cout<<"initial: ";
    for_each(a.begin(),a.end(),show);
    random_shuffle(a.begin(),a.end());
    cout<<"\nafter shaking: ";
    for_each(a.begin(),a.end(),show);
    sort(a.begin(),a.end());
    cout<<"\nAscending: ";
    for_each(a.begin(),a.end(),show);
    sort(a.begin(),a.end(),greater);
    cout<<"\nDescending: ";
    for_each(a.begin(),a.end(),show);
}

initial: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19       
after shaking: 12 1 9 2 0 11 7 19 4 15 18 5 14 13 10 16 6 3 8 17 
Ascending: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19     
Descending: 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0  

到此這篇關(guān)于C++STL教程之vector模板的使用的文章就介紹到這了,更多相關(guān)C++ vector模板內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C++中的四個(gè)默認(rèn)成員函數(shù)與運(yùn)算符重載詳解

    C++中的四個(gè)默認(rèn)成員函數(shù)與運(yùn)算符重載詳解

    這篇文章主要給大家介紹了關(guān)于C++中四個(gè)默認(rèn)成員函數(shù)與運(yùn)算符重載的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來跟著小編一起學(xué)習(xí)學(xué)習(xí)吧。
    2017-08-08
  • 淺談C++有理數(shù)的表達(dá)和計(jì)算

    淺談C++有理數(shù)的表達(dá)和計(jì)算

    這篇文章主要為大家詳細(xì)介紹了C++有理數(shù)的表達(dá)和計(jì)算,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-11-11
  • C++重載的奧義之運(yùn)算符重載詳解

    C++重載的奧義之運(yùn)算符重載詳解

    函數(shù)的重載是指利用相同的函數(shù)名設(shè)計(jì)一系列功能相近,但是功能細(xì)節(jié)不一樣的函數(shù)接口;因此運(yùn)算符重載也是指對(duì)于同一個(gè)運(yùn)算符來說,它可以用于實(shí)現(xiàn)不同的功能。下面就一起來理解下運(yùn)算符重載的應(yīng)用吧
    2023-04-04
  • C語言算法練習(xí)之折半查找的實(shí)現(xiàn)

    C語言算法練習(xí)之折半查找的實(shí)現(xiàn)

    二分查找法(也叫折半查找)其本質(zhì)是分治算法的一種。這篇文章主要介紹了如何利用C語言實(shí)現(xiàn)折半查找,感興趣的小伙伴可以學(xué)習(xí)一下
    2022-05-05
  • C語言快速掌握位段使用

    C語言快速掌握位段使用

    位段位段的聲明和結(jié)構(gòu)是類似的,但是也會(huì)有所不同,此篇文章將帶你了解位段是什么已以及位段的使用和位段的特性,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧
    2022-09-09
  • c++帶有string的結(jié)構(gòu)體賦值和清零問題

    c++帶有string的結(jié)構(gòu)體賦值和清零問題

    這篇文章主要介紹了c++帶有string的結(jié)構(gòu)體賦值和清零問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-01-01
  • C++實(shí)現(xiàn)逆波蘭表達(dá)式的例題詳解

    C++實(shí)現(xiàn)逆波蘭表達(dá)式的例題詳解

    逆波蘭表達(dá)式由波蘭的邏輯學(xué)家盧卡西維茲提出,它的特點(diǎn)是:沒有括號(hào),運(yùn)算符總是放在和它相關(guān)的操作數(shù)之后。本文將通過例題講講如何利用C++實(shí)現(xiàn)逆波蘭表達(dá)式,需要的可以參考一下
    2022-12-12
  • C++ 實(shí)現(xiàn)求小于n的最大素?cái)?shù)的實(shí)例

    C++ 實(shí)現(xiàn)求小于n的最大素?cái)?shù)的實(shí)例

    這篇文章主要介紹了C++ 實(shí)現(xiàn)求小于n的最大素?cái)?shù)的實(shí)例的相關(guān)資料,需要的朋友可以參考下
    2017-05-05
  • C語言文件操作函數(shù)freopen詳細(xì)解析

    C語言文件操作函數(shù)freopen詳細(xì)解析

    替換一個(gè)流,或者說重新分配文件指針,實(shí)現(xiàn)重定向。如果stream流已經(jīng)打開,則先關(guān)閉該流。如果該流已經(jīng)定向,則freopen將會(huì)清除該定向。此函數(shù)一般用于將一個(gè)指定的文件打開一個(gè)預(yù)定義的流:標(biāo)準(zhǔn)輸入、標(biāo)準(zhǔn)輸出或者標(biāo)準(zhǔn)出錯(cuò)
    2013-10-10
  • C和C++的區(qū)別詳解

    C和C++的區(qū)別詳解

    這篇文章主要介紹了C和C++之間的區(qū)別,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-10-10

最新評(píng)論

汕头市| 南雄市| 丽江市| 婺源县| 青河县| 丹阳市| 光山县| 碌曲县| 祁东县| 蒙自县| 丰城市| 芜湖市| 响水县| 凤冈县| 增城市| 东山县| 开原市| 湾仔区| 永德县| 静安区| 台南市| 南澳县| 阿尔山市| 辽源市| 库伦旗| 鲁甸县| 安溪县| 贡山| 永寿县| 临西县| 汾阳市| 合川市| 黄山市| 巫溪县| 宝山区| 独山县| 定州市| 饶河县| 黄浦区| 肥城市| 巩留县|