最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會(huì)員登陸 & 注冊(cè)

C++ 順序容器操作

2023-04-24 20:00 作者:S-a-i_  | 我要投稿



push_back從順序容器后添加一個(gè)元素(array和forward_list不支持)

注:當(dāng)我們用一個(gè)對(duì)象來初始化容器時(shí),或?qū)⒁粋€(gè)對(duì)象插入容器中時(shí),實(shí)際上放入到容器中的是一個(gè)對(duì)象值的拷貝,而不是對(duì)象本身。


push_front

除了push_back,list、forward_list和deque容器還支持push_front將元素插入容器頭部

deque提供了vector不支持的push_front。


在容器中的特定位置添加元素

insert成員允許我們?cè)谌萜髦腥我馕恢貌迦朐?。vector、deque、list和string都支持insert成員。forward_list提供了特殊版本的insert,我們后面會(huì)介紹。

每個(gè)insert函數(shù)都接受一個(gè)迭代器作為其第一個(gè)參數(shù),迭代器指出在容器中什么位置放置新元素,它可以指向任何位置甚至容器尾部之后的下一個(gè)位置,所以insert函數(shù)將元素插入到迭代器所指位置之前,這樣我們也能很容易在容器首部插入元素。

在a容器尾部的下一個(gè)位置之前插入“123”。

雖然某些容器不支持push_front但是他們對(duì)于insert并無類似的限制,因此我們可以用insert在容器首部插入元素。

如果接受一個(gè)元素?cái)?shù)目和一個(gè)值

接受一對(duì)迭代器或一個(gè)初始化列表的insert將給定范圍中的元素插入到指定位置之前

c++11下,接受元素個(gè)數(shù)或范圍insert版本返回指向第一個(gè)新加入元素的迭代器。如果范圍為空,不插入任何元素insert操作會(huì)將第一個(gè)參數(shù)返回。


insert的返回值

通過使用insert的返回值,可以在容器中一個(gè)特定位置反復(fù)插入元素

每步while循環(huán)會(huì)將一個(gè)新元素插入到iter之前,并將iter重新改變?yōu)閘st.begin(),所以我們?cè)L問不到那些原先加入的元素。


使用emplace

C++11中含有emplace_front、emplace_back和emplace三個(gè)成員,這些操作構(gòu)造而不是拷貝元素,分別對(duì)應(yīng)push_front、push_back和insert三種操作。

調(diào)用push和insert是將元素類型的對(duì)象傳遞給他們,這些對(duì)象被拷貝到容器中,而我們調(diào)用一個(gè)emplace時(shí),是將參數(shù)傳遞給元素類型的構(gòu)造函數(shù),emplace使用這些參數(shù)在容器管理的內(nèi)存空間中直接構(gòu)造元素

emplace函數(shù)根據(jù)元素類型而變化

同時(shí)我們傳遞的參數(shù)必須能夠和構(gòu)造函數(shù)匹配。



訪問元素

包括array在內(nèi)的每個(gè)順序容器都有一個(gè)front成員函數(shù),而除forward_list之外所有順序容器都包含一個(gè)back成員函數(shù),這兩個(gè)成員分別返回首元素和尾元素的引用

注意:如果c為空,那么以上的操作都將是未定義的。


訪問成員函數(shù)返回的時(shí)引用

在容器中訪問元素的成員函數(shù)(front、back、下標(biāo)和at)返回的都是引用,如果容器是一個(gè)const,則返回的是const的引用。


下標(biāo)操作和安全的隨機(jī)訪問

提供快速隨機(jī)訪問的容器(string、vector、deque和array)都提供下標(biāo)運(yùn)算符。

如果我們希望下標(biāo)是合法的,可以使用at成員函數(shù),at成員函數(shù)類似下標(biāo)運(yùn)算符,但如果下標(biāo)越界,at會(huì)拋出一個(gè)out_of_range異常



刪除元素

與vector和string不支持push_front一樣,這些類型也不支持pop_front,類似的forward_list也不支持pop_back。不能對(duì)一個(gè)空容器執(zhí)行彈出操作。
由于他們返回值為void所以如果需要記錄彈出的值要提前記錄。


從容器內(nèi)部刪除一個(gè)元素

erase無論是刪除單個(gè)元素還是一個(gè)范圍的元素,返回的都是指向刪除的(最后一個(gè))元素之后的位置的迭代器

刪除多個(gè)元素


特殊的forward_list操作

由于單向鏈表的特性,為了刪去或添加某個(gè)元素,我們需要把前驅(qū)的元素的鏈接改為刪去元素的后繼,但是單向鏈表沒有簡單的方法獲得一個(gè)元素的前驅(qū),所以forward_list是通過改變定義元素之后的元素來完成添加或刪除的,這樣我們就不用獲得前驅(qū)了。

由于操作和其他容器上的操作不同,forward_list并沒有定義insert、emplace和erase,而是定義了insert_after、emplace_after和erase_after的操作。如果我們要?jiǎng)h除第三個(gè)元素,那么就要erase_after指向第二個(gè)元素的迭代器。

同時(shí)forward_list也定義了before_begin,他返回一哥首前迭代器,這個(gè)迭代器允許我們?cè)谑自刂澳莻€(gè)不存在元素的位置添加或刪除元素。


改變?nèi)萜鞔笮?/p>

同理如果保存的是類元素,類元素必須提供默認(rèn)構(gòu)造函數(shù)。


編寫改變?nèi)萜鞯难h(huán)程序

添加/刪除vector、string或deque元素的循環(huán)程序必須考慮迭代器、引用和指針可能失效的問題,程序必須保證每個(gè)循環(huán)步中都更新迭代器、引用或指針。

如果是insert或者erase更新迭代器是比較容易的,因?yàn)樗麄兛梢苑祷氐?/p>

insert和erase都會(huì)改變程序的迭代器,所以我們都要重新更新迭代器。

調(diào)用erase后我們刪去當(dāng)前偶數(shù)元素,并且返回刪去元素的后一個(gè)元素的迭代器。

調(diào)用insert,我們會(huì)在當(dāng)前元素之前插入一個(gè)元素,并且返回插入元素的迭代器,由于vector的迭代器支持+=運(yùn)算,所以我們讓迭代器+2,讓他置于我們下一個(gè)需要檢查的數(shù)的迭代器。


不要保存end返回的迭代器

當(dāng)我們添加或刪除vector或string的元素后,或在deque中首元素之外任何位置刪除或添加元素后,原來的end迭代器都會(huì)失效。

如果我們有一個(gè)程序想在每個(gè)元素后添加一個(gè)元素

此代碼會(huì)無限循環(huán),因?yàn)槲覀僫nsert之后end就失效了,這樣我們的begin永遠(yuǎn)找不到end。

正確的處理是在while的條件中,每次都更新v.end。

C++ 順序容器操作的評(píng)論 (共 條)

分享到微博請(qǐng)遵守國家法律
蓝田县| 彭州市| 林芝县| 鹿邑县| 东光县| 松桃| 登封市| 左权县| 元氏县| 南投县| 太和县| 南岸区| 西乌珠穆沁旗| 泸定县| 辉南县| 泰来县| 津南区| 巴中市| 乌鲁木齐市| 哈巴河县| 原阳县| 大兴区| 新建县| 梁河县| 疏勒县| 盐津县| 宜兰县| 高邑县| 封开县| 威海市| 福州市| 南陵县| 德阳市| 苗栗县| 香港| 高邑县| 体育| 渝北区| 海晏县| 三河市| 远安县|