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

C++Primer筆記之順序容器的使用詳解

 更新時(shí)間:2013年05月07日 12:03:50   作者:  
本篇文章對(duì)C++Primer 順序容器的使用進(jìn)行了詳細(xì)的分析介紹。需要的朋友參考下

  順序容器,它將單一類型元素聚集起來(lái)成為容器,然后根據(jù)位置來(lái)存儲(chǔ)和訪問(wèn)這些元素,這就是順序容器。標(biāo)準(zhǔn)庫(kù)里定義了三種類型:vector(支持快速隨機(jī)訪問(wèn))、list(支持快速插入、刪除)、deque(雙端隊(duì)列)容器只定義了少量操作,大多數(shù)額外的操作由算法庫(kù)提供。容器內(nèi)元素的類型約束;1、元素類型必須支持賦值運(yùn)算;2、元素類型的對(duì)象必須可以復(fù)制。這是容器元素類型的最低要求,如果想支持一些其他特殊要求,則必須具備相關(guān)的性質(zhì)。

可以定義容器的容器vector< vector<int> > lines;//必須使用"> >"中間的空格,否則會(huì)出現(xiàn)變異錯(cuò)誤

迭代器運(yùn)算:

  關(guān)系操作符只適用于vector和deque容器,它們可以根據(jù)元素位置直接有效地訪問(wèn)指定的容器元素。而list容器的迭代器既不支持算術(shù)運(yùn)算(加法或者減法),也不支持關(guān)系運(yùn)算(<=,<,>=,>),它只提供前置和后置的自增、自減運(yùn)算以及相等(不等)運(yùn)算。

迭代器范圍:

  c++使用一對(duì)迭代器標(biāo)記迭代器范圍,通常命名為first和last或beg和end。該范圍內(nèi)的元素包括迭代器first指向的元素,以及從first開(kāi)始一直到迭代器last指向的位置之前的所有元素,此類元素范圍稱為左閉合區(qū)間[first,last)。

順序容器的操作:

  在容器中添加元素;在容器中刪除元素;設(shè)置容器大??;獲取容器內(nèi)的第一個(gè)和最后一個(gè)元素。對(duì)于begin()、end()、rbegin()、 rend()四個(gè)操作,均有const版本。如果容器時(shí)const,則其返回類型要加上const_前綴。c.push_back(t) 在容器c的尾部添加值為t的元素,返回void類型。c.push_front(t) 在容器c的前端添加值為t的元素,返回void類型。但是只有l(wèi)ist和deque具有這樣的性質(zhì)。

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

//容器的順序遍歷
vector<int>::reverse_iterator iterReverse=vect.rbegin();//定義反向迭代器while(iterReverse!=vect.rend())
{
    cout<<*iterReverse<<endl;
    iterReverse++;
}
vector<int>::iterator iter = vect.begin();//定義正向迭代器
while(iter!=vect.end())
{
    cout<<*iter<<endl;
    iter++;
}

  在容器中的指定位置添加元素:使用insert函數(shù):由于迭代器可能指向超出容器末端的下一位置沒(méi)這事一個(gè)不存在的元素,因此insert函數(shù)是在其指向位置之前而非其后插入元素。mylist.insert(iter,element);
復(fù)制代碼 代碼如下:

//獲取中心位置迭代器,需要注意的list不允許如下的迭代器的加法
vector<int>::iterator middle=vectCpy.begin()+vect.size()/2;
vectCpy.insert(middle,1001);//在中間位置添加一個(gè)元素 

  插入一段元素:
復(fù)制代碼 代碼如下:

vectCpy.insert(vectCpy.begin(),10,9);//在第一個(gè)元素后面添加10個(gè)初值為9的元素
int num[3]={555,666,777};
vectCpy.insert(vectCpy.end(),num,num+3);//在vectCpy后面加入一段來(lái)自num數(shù)組里的元素
vectCpy.insert(vectCpy.end(),vect.begin(),vect.end());//在vectCpy后加入一段來(lái)自迭代器對(duì)間的元素

  需要注意的是,添加元素可能會(huì)導(dǎo)致某些或全部迭代器失效,假設(shè)所有迭代器失效是最安全的做法。不要存儲(chǔ)end操作返回的迭代器,為了避免存儲(chǔ)end迭代器,可以在每次做完插入運(yùn)算重新計(jì)算end迭代器值。

關(guān)鍵概念:容器元素都是副本在容器中添加元素時(shí),系統(tǒng)是將元素值復(fù)制到容器里。類似的,使用一段元素初始化新容器時(shí),新容器存放的事原始元素的副本。本復(fù)制的原始值與新容器中的元素各不相干,此后,容器內(nèi)元素值發(fā)生變化時(shí),被復(fù)制的原值不會(huì)受到影響,反之亦然。

容器的比較:

  比較的容器必須具有相同的容器類型,而且其元素類型也必須相同。容器的比較式基于容器內(nèi)元素的比較。兩個(gè)容器具有相同的長(zhǎng)度而且所有的元素都相等,那么這兩個(gè)容器就相等。如果兩個(gè)容器長(zhǎng)度不相等,但較短的容器中所有元素都等于較長(zhǎng)容器中對(duì)應(yīng)的元素,則稱較短的容器小于另一個(gè)容器。如果兩個(gè)容器都是對(duì)方的初始子序列,則它們的比較結(jié)果取決于所比較的第一個(gè)不相等的元素。

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

vector<int> vect;
vect.push_back(1);
vect.push_back(2);
vect.push_back(3);
vector<int> vectCpy(vect);
if(vectCpy==vect) cout<<"Equal"<<endl;
else cout<<"Not Equal"<<endl;

容器大小的操作:

  容器類型提供resize函數(shù)來(lái)改變?nèi)萜魉脑貍€(gè)數(shù)。如果當(dāng)前的容器長(zhǎng)度大于新的長(zhǎng)度值,則該容器后部的元素會(huì)被刪除,如果當(dāng)前的容器長(zhǎng)度小于新的長(zhǎng)度值,則系統(tǒng)會(huì)在該容器后部添加新元素。resize操作可能會(huì)使迭代器失效。例子:

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

list<int> ilist(10,2);//10個(gè)元素容器,初始值均為2
ilist.resize(15);//在原有基礎(chǔ)上,再后面添加5個(gè)元素,初始值為0
ilist.resize(25,-1);//在上行的基礎(chǔ)上,再后面再添加10個(gè)元素,值為-1
ilist.resize(5);//在ilist的后部刪除20個(gè)元素

訪問(wèn)元素:

  如果容器非空,那么容器類型的front和back成員將返回容器內(nèi)第一個(gè)或最后一個(gè)元素的引用

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

int &ref=vect.front();//front和back返回容器內(nèi)第一個(gè)或最后一個(gè)元素的引用
ref=1000001;//改變引用的元素,vect內(nèi)元素的值也會(huì)改變
cout<<vect[0]<<" "<<vect.at(1)<<endl;//只適用于vector和deque,如果給出的下標(biāo)無(wú)效,則會(huì)發(fā)生outOfRange的異常

刪除元素:

  pop_front和pop_back函數(shù)用于刪除容器內(nèi)的第一個(gè)和最后一個(gè)元素。

  刪除一個(gè)或者一段元素更通用的方法是用erase操作,有兩個(gè)版本:刪除由一個(gè)迭代器指向的單個(gè)元素,或刪除由一對(duì)迭代器標(biāo)記的一段元素。erase返回一個(gè)迭代器,它指向被刪除元素或元素段后面的元素。通常,必須在容器中查找要?jiǎng)h除的元素后,才使用erase操作。尋找一個(gè)指定元素最簡(jiǎn)單的方法,是使用標(biāo)準(zhǔn)庫(kù)中的find方法。必須包含頭文件algorithm.h

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

#include<algorithm>
list<int>::iterator searchIter= find(mylist.begin(),mylist.end(),1233);
if(searchIter!=mylist.end())//有可能找不到
{
mylist.erase(searchIter);
}


  刪除容器內(nèi)所有元素:mylist.clear()或者mylist.erase(mylist.begin(),mylist.end());

容器的選用:

  vector和deque容器提供了對(duì)元素的快速隨機(jī)訪問(wèn),但付出的代價(jià)是,在容器的任意位置插入或刪除元素,比在容器尾部插入和刪除元素的開(kāi)銷更大。list類型在任何位置都能快速插入和刪除,但付出的代價(jià)是元素的隨機(jī)訪問(wèn)開(kāi)銷較大。其原因就是在內(nèi)部實(shí)現(xiàn)的數(shù)據(jù)結(jié)構(gòu)中,一個(gè)是在內(nèi)存中順序地址分批的,而另一個(gè)是在類似鏈表的方式,隨機(jī)地址分配的,所以導(dǎo)致性質(zhì)的不同。

相關(guān)文章

  • C語(yǔ)言的字符空間與非字符空間你了解嗎

    C語(yǔ)言的字符空間與非字符空間你了解嗎

    這篇文章主要介紹了C語(yǔ)言的字符空間與非字符空間,本文給大家介紹的非常詳細(xì),具有參考借鑒價(jià)值,需要的朋友可以參考下,希望能給你帶來(lái)幫助
    2021-08-08
  • C語(yǔ)言形參與實(shí)參使用的差別講解

    C語(yǔ)言形參與實(shí)參使用的差別講解

    形參出現(xiàn)在函數(shù)定義中,在整個(gè)函數(shù)體內(nèi)都可以使用, 離開(kāi)該函數(shù)則不能使用。實(shí)參出現(xiàn)在主調(diào)函數(shù)中,進(jìn)入被調(diào)函數(shù)后,實(shí)參變量也不能使用,形參和實(shí)參的功能是作數(shù)據(jù)傳送。發(fā)生函數(shù)調(diào)用時(shí), 主調(diào)函數(shù)把實(shí)參的值傳送給被調(diào)函數(shù)的形參從而實(shí)現(xiàn)主調(diào)函數(shù)向被調(diào)函數(shù)的數(shù)據(jù)傳送
    2023-02-02
  • C語(yǔ)言動(dòng)態(tài)內(nèi)存分配的詳解

    C語(yǔ)言動(dòng)態(tài)內(nèi)存分配的詳解

    這篇文章主要介紹了C語(yǔ)言動(dòng)態(tài)內(nèi)存分配的詳解的相關(guān)資料,這里提供了實(shí)現(xiàn)方法整理和出現(xiàn)錯(cuò)誤的解決辦法,需要的朋友可以參考下
    2017-07-07
  • C語(yǔ)言菜鳥基礎(chǔ)教程之常量和變量

    C語(yǔ)言菜鳥基礎(chǔ)教程之常量和變量

    在C語(yǔ)言中,常量和變量都是可以用來(lái)存儲(chǔ)和表示數(shù)據(jù)的,常量值在程序執(zhí)行的過(guò)程中是不可變的,而變量是可變的
    2017-10-10
  • Qt實(shí)現(xiàn)驗(yàn)證碼相關(guān)功能的代碼示例

    Qt實(shí)現(xiàn)驗(yàn)證碼相關(guān)功能的代碼示例

    驗(yàn)證碼的原理基于人類視覺(jué)和計(jì)算機(jī)視覺(jué)的差異性,通過(guò)給用戶顯示一些難以被機(jī)器識(shí)別的圖形或文字,讓用戶進(jìn)行人機(jī)交互,確認(rèn)自己的身份,這樣可以有效保護(hù)網(wǎng)站安全,所以本給大家介紹了Qt實(shí)現(xiàn)驗(yàn)證碼相關(guān)功能的代碼示例,感興趣的朋友可以參考下
    2024-01-01
  • c++中的繼承關(guān)系

    c++中的繼承關(guān)系

    繼承呈現(xiàn)了面向?qū)ο蟪绦蛟O(shè)計(jì)的層次結(jié)構(gòu),體現(xiàn)了由簡(jiǎn)單到復(fù)雜的認(rèn)知過(guò)程,本文給大家介紹c++中的繼承關(guān)系,感興趣的朋友跟隨小編一起看看吧
    2021-07-07
  • C++中初始化二維數(shù)組的幾種常見(jiàn)方法

    C++中初始化二維數(shù)組的幾種常見(jiàn)方法

    本文詳細(xì)介紹了在C++中初始化二維數(shù)組的不同方式,包括靜態(tài)初始化、循環(huán)、全部為零、部分初始化、std::array和std::vector,以及std::vector作為動(dòng)態(tài)二維數(shù)組的靈活性和應(yīng)用場(chǎng)景,需要的朋友可以參考下
    2025-04-04
  • 美化你的代碼 vb(VBS)代碼格式化的實(shí)現(xiàn)代碼

    美化你的代碼 vb(VBS)代碼格式化的實(shí)現(xiàn)代碼

    雖然VB.NET出現(xiàn)很久了,但還有好多人仍然在使用VB6。我在實(shí)現(xiàn)一些小功能的時(shí)候也喜歡用VB6,畢竟誰(shuí)都不想每天的美好心情被VS那烏龜般的啟動(dòng)速度影響
    2012-05-05
  • C語(yǔ)言實(shí)現(xiàn)貪吃蛇游戲

    C語(yǔ)言實(shí)現(xiàn)貪吃蛇游戲

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)貪吃蛇游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-03-03
  • 基于Qt實(shí)現(xiàn)電子木魚小游戲

    基于Qt實(shí)現(xiàn)電子木魚小游戲

    今年最火爆的解壓小游戲電子木魚,現(xiàn)在許多軟件都上架了這個(gè)小程序。我在網(wǎng)上看了一下基本上都是用py和Java寫的,所以我用QT重新寫了一下,作為小白練手項(xiàng)目非常適合,快跟隨小編一起學(xué)習(xí)一下吧
    2023-01-01

最新評(píng)論

梅河口市| 施秉县| 扎囊县| 呼图壁县| 那曲县| 安吉县| 白朗县| 焦作市| 化隆| 福建省| 静海县| 麻江县| 民乐县| 陈巴尔虎旗| 高唐县| 凤冈县| 德阳市| 海南省| 邯郸县| 辽阳市| 黄骅市| 辽宁省| 崇文区| 兴城市| 和田市| 北碚区| 雷波县| 蓬莱市| 奈曼旗| 惠水县| 合川市| 蚌埠市| 新巴尔虎右旗| 宜阳县| 平阴县| 河北省| 河源市| 浠水县| 永泰县| 安多县| 长岭县|