国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > C++ > 正文

詳解C++ list中erase與remove函數的使用

2020-02-24 14:26:22
字體:
來源:轉載
供稿:網友

C語言中的erase與remove函數一直讓小編很迷糊,因為他們的功能都是一樣的,本文是詳解C++ list中erase與remove函數的使用方法,接下來武林技術頻道小編帶你一起來了解吧!

erase的作用是,使作為參數的迭代器失效,并返回指向該迭代器下一參數的迭代器。如下:

?

?

?

?


list ParticleSystem;
list::iterator pointer;
if(pointer->dead == true)
{
?? pointer = ParticleSystem.erase(pointer);
}


有一段關于錯誤使用erase的程序

?

?

?


using namespace std;
int main()
{
? std::listtest_list;
? std::list::iterator test_list_it;
? test_list.push_back(1);
? test_list_it = test_list.begin();
? for(;test_list_it != test_list.end();test_list_it++)
? {
? test_list.erase(test_list_it);
? }
}


問題:該程序不能跳出循環
原因:test_list.erase(test_list_it);每次做erase時都有可能使迭代器失效,test_list_it++就發生錯誤了。可以參見effective stl一書。所有容器做erase操作時都有可能使迭代器失效。
改為:

?

?

?


for(;test_list_it != test_list.end();)
{
??? test_list.erase(test_list_it++);
}


or

?

?

?


for(;test_list_it != test_list.end();)
{
??? std::list::iterator iter_e=test_list_it++;
??? test_list.erase(iter_e);
}


注意:

?

?

?


for(;test_list_it != test_list.end();test_list_it++;) {
??? std::list::iterator iter_e=test_list_it;
??? test_list.erase(iter_e);
}


這樣仍然是錯誤的,原因是:iter_e=test_list_it 是指針值的復制,它倆其實指向同一個位置,所以iter_e失效那么test_list_it也會失效,所以test_list_it++就會有問題
如果是

?

?

?


for(;test_list_it != test_list.end();)
{
??? std::list::iterator iter_e=test_list_it++;
??? test_list.erase(iter_e);
}


則沒有問題。
remove函數也存在erase函數同樣的問題,但remove函數返回值是空,erase返回指向下一個元素的迭代器。

下面是一個簡單的例子。

?

?

?


#include "stdafx.h"
#include <stdio.h>
#include <string.h>
#include <malloc.h>
#include <list>
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
?printf("------------------------------ Start/n");
?list<int> ls;
?printf("ls.empty() = %d /n", ls.empty());
?printf("ls.max_size() = %d /n", ls.max_size());
?printf("ls.size() = %d /n", ls.size());
?ls.push_back(1);
?ls.push_back(2);
?ls.push_back(3);
?printf("/n--------- after push 1, 2, 3 ---------/n");
?printf("ls.empty() = %d /n", ls.empty());
?printf("ls.max_size() = %d /n", ls.max_size());
?printf("ls.size() = %d /n", ls.size());
?for (list<int>::iterator i = ls.begin(); i != ls.end(); i++) {
??printf("%d, ", *i);
?}
?printf("/n------------------------------/n");
?for (list<int>::iterator i = ls.begin(); i != ls.end(); ) {
??printf("erase %d /n", *i);
??ls.erase(i++);
?}
?printf("/n--------- after erase ---------/n");
?printf("ls.empty() = %d /n", ls.empty());
?printf("ls.max_size() = %d /n", ls.max_size());
?printf("ls.size() = %d /n", ls.size());
?printf("/n------------------------------/n");
?ls.push_back(1);
?ls.push_back(2);
?ls.push_back(3);
?for (list<int>::iterator i = ls.begin(); i != ls.end(); ) {
??printf("remove %d /n", *i);
??ls.remove(*i++);
?}
?printf("/n--------- after remove ---------/n");
?printf("ls.empty() = %d /n", ls.empty());
?printf("ls.max_size() = %d /n", ls.max_size());
?printf("ls.size() = %d /n", ls.size());
?printf("/n------------------------------ End/n");
?getchar();
?return 0;
}


其中:

?

?

?


?for (list<int>::iterator i = ls.begin(); i != ls.end(); ) {
??printf("erase %d /n", *i);
??ls.erase(i++);
?}


也可以寫成下面的形式,因為erase函數的返回值就是指向下一個元素的迭代器。

?

?

?


?for (list<int>::iterator i = ls.begin(); i != ls.end(); ) {
??printf("erase %d /n", *i);
??i = ls.erase(i);
?}


輸出結果如下:
------------------------------ Start
ls.empty() = 1
ls.max_size() = 1073741823
ls.size() = 0
--------- after push 1, 2, 3 ---------
ls.empty() = 0
ls.max_size() = 1073741823
ls.size() = 3
1, 2, 3,
------------------------------
erase 1
erase 2
erase 3
--------- after erase ---------
ls.empty() = 1
ls.max_size() = 1073741823
ls.size() = 0
------------------------------
remove 1
remove 2
remove 3
--------- after remove ---------
ls.empty() = 1
ls.max_size() = 1073741823
ls.size() = 0
------------------------------ End

以上就是詳解C++ list中erase與remove函數的使用,相信時常關注武林技術頻道的朋友知道接下來怎么做了,如果你想了解更多專業知識記得關注我們哦。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 柯坪县| 博白县| 武冈市| 金沙县| 祁阳县| 疏勒县| 武强县| 玉门市| 新巴尔虎右旗| 精河县| 普陀区| 平邑县| 长岛县| 西藏| 治多县| 龙陵县| 淅川县| 乌审旗| 黎平县| 闸北区| 井陉县| 宁德市| 乐山市| 且末县| 女性| 哈尔滨市| 芦山县| 扶沟县| 罗江县| 烟台市| 盘锦市| 建平县| 鱼台县| 长春市| 和田市| 蓬莱市| 富锦市| 洛南县| 彩票| 冷水江市| 达孜县|