std vector插入和刪除高階

2021-08-21 02:54:37 字數 2085 閱讀 9973

std::vectorexamplevec = ;

1. 

iterator erase

(const_iterator pos )//

移除位於

pos的元素

注意點】:

(1)迭代器

pos必須合法且可解引用。所以

不能以end()

迭代器為 

pos的值

(合法,但不可解引用)

,不然會拋異常。

比如:examplevec.erase(examplevec.end()); ----->程式向你丟擲乙個大大的異常,並且崩潰了

2. 

iterator erase

(const_iterator first, const_iterator last )//

移除範圍

[first; last)

中的元素

注意點】:

(1) 

若first==last

,則迭代器

first

不必可解引用

:比如:examplevec.erase(examplevec.end(), examplevec.end());  --->合法的。原因參看下面第2點

(2) 

擦除空範圍是無操作

。比如:

examplevec.erase(example.begin(),examplevec.begin());   ---->

無任何操作,元素還是1,

2,3,

4,5,

6,7【返回值】:

erase操作的返回值均為最後刪除元素的下乙個元素的迭代器

,如果被刪除的元素是最後乙個元素,則返回的是end()迭代器。

【刪除元素迭代器失效問題】

因為刪除元素後,會導致該元素的迭代器失效,所以對vector迴圈遍歷刪除某些元素的時候,可能會有迭代器失效問題從而導致程式崩潰。

正確的做法是利用erase的返回值解決問題。下面是正確的示例,該示例演示刪除

vector

中所有的奇數元素。

for(

auto

beg = examplevec .begin(); beg

!=examplevec .end();)

//不是在這裡對beg++

else

++beg;

}程式輸出:2,4,6

1. 

iterator insert

(const_iterator pos, 

constt&

value );

//在pos前插入 

value

注意點】:

(1) 

pos可為

end()

迭代器比如: examplevec.insert( examplevec.end(),8)  --->正確,則現在元素為:1,2,3,4,5,6,7,8

返回值】:

insert操作的返回值都為第乙個插入元素的迭代器。【

插入元素迭代器失效問題

】因為插入元素後,後面的元素移動或者當前容量不夠存放元素時候進行容量擴充套件的時候,迭代器會失效,所以對vector迴圈遍歷插入某些元素時候,可能會有迭代器失效問題從而導致程式崩潰。

正確的做法也是利用insert的返回值。下面是正確的示例,該示例演示在

vector

中所有偶數元素後面插入乙個數

100。

for(

auto

beg = vec.begin(); beg

!=vec.end();

++beg)

}程式輸出:1,2,100,3,4,100,5,6,100,7

總結:關於插入刪除迭代器失效的問題,c++11中都使用插入/刪除的返回值來獲取正確的返回值

。以上**都經過vs2017測試執行。最後吐槽一下,網上好多部落格內容都是一本正經的胡說。

std vector的分片拷貝和插入

readbuffer.insert m readbuffer.end tmpreadbuffer.begin tmpreadbuffer.end readbuffer.insert m readbuffer.end tmpreadbuffer.begin tmpreadbuffer.begin of...

std vector的分片拷貝和插入

readbuffer.insert m readbuffer.end tmpreadbuffer.begin tmpreadbuffer.end readbuffer.insert m readbuffer.end tmpreadbuffer.begin tmpreadbuffer.begin of...

std vector刪除重複元素和查詢

原文 需要這樣乙個容器,可以自動地刪除重複元素,並能很方便地進行查詢操作!似乎採用樹型結構儲存的std set是最佳之選,但到後面才發現,存進去容易,取出來麻煩。不得已又回去用std vector,就在網上找了找,vector是如何實現類似set的unique和find的。其實也沒有想象的複雜,也不...