C++日记——list的erase用法 c list erase 指定

STL中list的erase用法

erase的作用是,使作为参数的迭代器失效,并返回指向该迭代器下一参数的迭代器。

如下:

list<DotSource>ParticleSystem;

list<DotSource>::iteratorpointer;

if(pointer->dead == true)
{
pointer =ParticleSystem.erase(pointer);
}

有一段关于错误使用erase的程序

#include<stdio.h>
#include<list>
using namespace std;
int main()
{
std::list<int>test_list;
std::list<int>::iteratortest_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++就发生错误了。可以参见effectivestl一书。所有容器做erase操作时都有可能使迭代器失效。

改为:

for(;test_list_it != test_list.end();)

{
test_list.erase(test_list_it++);
}

or

for(;test_list_it != test_list.end();)
C++日记——list的erase用法 c list erase 指定

{
std::list<int>::iteratoriter_e=test_list_it++;
test_list.erase(iter_e);
}

注意:

for(;test_list_it != test_list.end();test_list_it++;)

{
std::list<int>::iteratoriter_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<int>::iteratoriter_e=test_list_it++;
test_list.erase(iter_e);
}
则没有问题。

  

爱华网本文地址 » http://www.aihuau.com/a/25101016/311640.html

更多阅读

睫毛膏的正确用法 睫毛膏如何使用

  睫毛膏对于很多女孩子来说其实并不陌生,但是大家真的知道睫毛膏的正确用法吗,如何使用睫毛膏才能让自己的睫毛更翘、更卷,而且看起来不会显得很僵硬呢,如果你还不懂那就来一起学习一下睫毛膏的正确用法吧。睫毛膏的正确用法——工

护发素的正确用法 怎样使用护发素

护发素的正确用法是什么呢?本期小编将为大家一一详细解说,想了解的朋友们千万别错过哦!护发素的正确用法——步骤/方法护发素的正确用法 1、1、在使用护发素之前,先用毛巾吸干洗净后的头发上的水,因为头发里水太多时,护发素不能有效被吸

《作曲大师》的基本用法 风雅作曲大师免费版

《作曲大师》的基本用法我对简谱知识只是粗略的了解一些,尤其是专业名词说不上来,有朋友需要,还是要硬着头皮介绍一下有关使用《作曲大师》做歌篇的基本步骤及方法。1. 设置:进入软件后,设定歌名、作曲等等,设定声部(单谱或二声部、四声

声明:《C++日记——list的erase用法 c list erase 指定》为网友秀飜全场分享!如侵犯到您的合法权益请联系我们删除