c 中的向量一般操作

2021-07-03 13:52:43 字數 3854 閱讀 3509

.vector的刪除操作

1. 可以使用四種方式刪除vector中的元素:
第一種是使用向量容器vector的成員函式erase(使用這種方式並不能清除刪除元素所佔的記憶體空間),由於向量容器vector中的元素在記憶體中都是按順序排放的,所以刪除某個元素後,會導致迭代器失效,因為刪除了乙個元素會使其他元素向前移動例如 12345678 中刪除6 則變成12345788 就是7和8向前移動了一位而最後的乙個元素並沒有在記憶體中刪除,所以如果不更新end的話會指向最後乙個8 而最後乙個8在邏輯上已經被刪除了。所以或者(重新更新迭代器begin和end)或者(更新迭代器end和利用erase返回指向被刪除元素的下乙個元素的有效迭代器更新)這兩種方式都可以使迭代器不失效;

samples:

[cpp] view plaincopyprint?

01.int v3[10] = ;

02.vector vecdeleted1(&v3[0],&v3[9]+1);

03.

04.typedef vector::iterator vector_iter;

05.vector_iter iterend=vecdeleted1.end();

06.for(vector_iter iter=vecdeleted1.begin();iter!=iterend;++iter)

07.

上面的**是要依次刪除vecdeleted1裡的所有元素,但是會有乙個問題,當刪除第乙個元素0後,再次遍歷的時候,迭代器會報錯,這就是迭代器失效造成的,所以可以使用

(更新迭代器end和利用erase返回指向被刪除元素的下乙個元素的有效迭代器更新)的方式更新迭代器,修改**如下:

iterator erase( iterator loc ); iterator erase( iterator start, iterator end );

erase函式要麼刪作指定位置loc的元素,要麼刪除區間[start, end)的所有元素.返回值是指向刪除的最後乙個元素的下一位置的迭代器.

.[cpp] view plaincopyprint?

01.int v3[10] = ;

02.vector vecdeleted1(&v3[0],&v3[9]+1);

03.

04.typedef vector::iterator vector_iter;

05.//vector_iter iterend=vecdeleted1.end();

06.for(vector_iter iter=vecdeleted1.begin();iter!=vecdeleted1.end();)

07.

將迭代器iter更新到刪除元素的下乙個元素,然後在for迴圈裡使用vecdeleted1.end()代替原先的iterend,每次遍歷的時候都更新一下vector的最末元素迭代器end()(要是不跟新這個,那麼使用原先的end()指向了乙個未知區域,程式當然報錯)這樣程式就不會報錯

使用erase刪除特定元素3的方式:

[cpp] view plaincopyprint?

01.vector_iter itervecdel=find(vecdeleted1.begin(),vecdeleted1.end(),3);

02.if(itervecdel!=vecdeleted1.end())

03.

首先使用stl演算法類裡的find方法,找到元素3,返回乙個指向元素3的迭代器itervecdel1,然後使用erase方法將元素3刪除

思考:如果使用erase刪除了乙個向量vector元素,那麼其他元素在記憶體中是怎麼移動的呢

vecdeleted1:0,1,2,3,4,5,6,7,8,9 vecdeleted1[9]==9

刪除元素3後:

[cpp] view plaincopyprint?

01.vector_iter itervecdel=find(vecdeleted1.begin(),vecdeleted1.end(),3);

02.if(itervecdel!=vecdeleted1.end())

03.

vecdeleted1:0,1,2,4,5,6,7,8,9

那麼原先vecdeleted1[9]的位置元素是什麼呢,那塊記憶體還有元素嗎,答案是肯定的,由於vector使用erase刪除元素時,雖然將刪除的元素從向量中移走了,然後移走後面的所有元素都是很有次序的往前移了一步,那麼最後一塊記憶體裡的值原先是9,9向前移了一步,那麼原先的那塊記憶體vecdeleted1[9]還是9,並沒有刪除那塊9這個元素,所以使用erase雖然從表面上看向量vector裡的元素變少了,但是實際暫用的記憶體可沒有變少哦!切記,既然erase不能把該死的元素從記憶體中移除,那不是很危險,該怎麼辦呢,所以下面的第二種方法就能徹底的解決這個問題。

第二種是使用stl演算法類裡的remove函式和erase搭配的方式進行刪除(此方式不用更新迭代器)(實際上在vector容器使用remove函式只是將要刪除的元素放到了容器的最後,不會刪除元素。在stl所有容器中,唯一乙個使用remove函式做了刪除操作的是list容器的remove)

samples:

[cpp] view plaincopyprint?

01.int v3[10] = ;

02.vector vecdeleted1(&v3[0],&v3[9]+1);

03.

04.typedef vector::iterator vector_iter;

05.for(vector_iter iter=vecdeleted1.begin();iter!=vecdeleted1.end();++iter)

06.

remove在乙個給定範圍內刪除滿足一定條件的元素,刪除完成後,向量的大小不變,也就是說,它僅僅是將要刪除的元素放到容器最後,而將所有未刪除的元素前移而已。而且它返回的是指向那個移動元素位置之後的那個迭代器,所以上面的**在使用remove之後,返回的迭代器指向向量的最後乙個元素,也就是:- - vecdeleted1.end()。

然後在呼叫erase將向量的最後乙個元素移除,由於最後乙個元素後面就沒有向量資料了,所以也不會往前移動任何資料,所以這樣就能將向量最後乙個元素移除而且還能清空這塊記憶體。使用這種方式就沒必要更新迭代器了,因為移除向量的末尾元素不會對前面的元素迭代器造成影響。只需再每次for迴圈更新一下end迭代器就行。

刪除特定元素的方式(刪除元素3):

[cpp] view plaincopyprint?

01.vecdeleted1.erase(remove(vecdeleted1.begin(),vecdeleted1.end(),3),vecdeleted1.end());

第三種是使用vector的成員函式clear()(清空向量裡的所有元素)

第四種是使用vector的成員函式pop_back()(移除向量裡的最後乙個元素)

vector刪除元素總結:

1.使用erase方法不能清元素所佔記憶體,只能將向量裡的元素「表面的」移走;使用erase方法和remove方法配合使用可以真正清除向量裡的元素和其所佔記憶體,所以要刪除vector裡的元素就必須使用erase和remove配套使用

2.刪除元素之後應該將相應的(begin迭代器,end迭代器)或(erase返回的迭代器,end迭代器)更新一下

刪除a中相同的元素

unique(num,mun+n)返回的是num去重後的尾位址,之所以說比不真正把重複的元素刪除,其實是,該函式把重複的元素一到後面去了,然後依然儲存到了原陣列中,然後返回去重後最後乙個元素的位址,因為unique去除的是相鄰的重複元素,所以一般用之前都會要排一下序

sort( a.begin(), a.end() );

a.erase( unique( a.begin(), a.end() ), a.end() );

xml一般操作

讀xml內容 xmldocument xml new xmldocument xml.loadxml ret xmlnode node xml.selectsinglenode ex message ex devip if node null 寫xml內容 xmldocument xmldoc ne...

c 操作xml一般通用的範例

using system using system.collections using system.componentmodel using system.data using system.drawing using system.web using system.web.sessionstat...

c 操作xml一般通用的範例

using system using system.collections using system.componentmodel using system.data using system.drawing using system.web using system.web.sessionstat...