社区
C++ 语言
帖子详情
如何删除list中的对象?
liaomingxue
2009-06-04 10:32:05
list<Student> list1;
list1.push_back((*)(new Student()));
list1.push_back((*)(new Student()));
那么如何删除中间创建的两个Student指针指向的内存空间?
...全文
931
20
打赏
收藏
如何删除list中的对象?
list list1; list1.push_back((*)(new Student())); list1.push_back((*)(new Student())); 那么如何删除中间创建的两个Student指针指向的内存空间?
复制链接
扫一扫
分享
举报
写回复
配置赞助广告
用AI写文章
20 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
CHINAonlyQiu
2010-12-06
打赏
举报
回复
Student_list.erase(stud2);如果说其中的stud2是逆序的一个list对象,即list <stuInfo> :: reverse_iterator stud1,stud2;那将如何解决呢?好像是erase中没有这样的重载函数哦!
iambic
2009-06-04
打赏
举报
回复
另外,那两个指针不是list中的对象。
goodname
2009-06-04
打赏
举报
回复
这样用没法删除。必须得把指针保存下来才可以删除。
不必非的使用new,直接创建对象就行。
list1.push_back(Student());
iambic
2009-06-04
打赏
举报
回复
滥用指针,没法删除了。
liaomingxue
2009-06-04
打赏
举报
回复
[Quote=引用 9 楼 GS_Neo 的回复:]
UP,建议楼主看一下list的用法。。。。
STL中用erase()方法遍历删除元素
STL中的容器按存储方式分为两类,一类是按以数组形式存储的容器(如:vector 、deque);另一类是以不连续的节点形式存储的容器(如:list、set、map)。在使用erase方法来删除元素时,需要注意一些问题。
在使用 list、set 或 map遍历删除某些元素时可以这样使用:
正确使用方法1 std::list < int> List;
std::list < in…
[/Quote]
谢谢你的办法。但是你的办法不是解决我的问题的办法。因为list <Student>而不是list <Student*>。
10楼的兄弟说的还是有道理的。
jkdfjkdf
2009-06-04
打赏
举报
回复
[Quote=引用 8 楼 liaomingxue 的回复:]
我也有同感,但别人定义了一个这样的类型,我也没有法子
[/Quote]
if 你可以改
用指针好了, 简单
else if 你不能改 && 能联系到那个别人
钉死他, 让他改
else if 人品好 {
拼人品, 反正程序结束就会被干掉, 只要调的不多, 泄露的就不厉害.
同情.
} else { /* 人品不好 */
扎小草人, 那小针扎 ...
更同情.
}
GS_Neo
2009-06-04
打赏
举报
回复
UP,建议楼主看一下list的用法。。。。
STL中用erase()方法遍历删除元素
STL中的容器按存储方式分为两类,一类是按以数组形式存储的容器(如:vector 、deque);另一类是以不连续的节点形式存储的容器(如:list、set、map)。在使用erase方法来删除元素时,需要注意一些问题。
在使用 list、set 或 map遍历删除某些元素时可以这样使用:
正确使用方法1 std::list< int> List;
std::list< int>::iterator itList;
for( itList = List.begin(); itList != List.end(); )
{
if( WillDelete( *itList) )
{
itList = List.erase( itList);
}
else
itList++;
}
或
正确使用方法2 std::list< int> List;
std::list< int>::iterator itList;
for( itList = List.begin(); itList != List.end(); )
{
if( WillDelete( *itList) )
{
List.erase( itList++);
}
else
itList++;
}
下面是两个错误的使用方法:
错误使用方法1 std::list< int> List;
std::list< int>::iterator itList;
for( itList = List.begin(); itList != List.end(); itList++)
{
if( WillDelete( *itList) )
{
List.erase( itList);
}
}
或
错误使用方法2 std::list< int> List;
std::list< int>::iterator itList;
for( itList = List.begin(); itList != List.end(); )
{
if( WillDelete( *itList) )
{
itList = List.erase( ++itList);
}
else
itList++;
}
正确使用方法1:通过erase方法的返回值来获取下一个元素的位置
正确使用方法2:在调用erase方法之前先使用 “++”来获取下一个元素的位置
错误使用方法1:在调用erase方法之后使用“++”来获取下一个元素的位置,由于在调用erase方法以后,该元素的位置已经被删除,如果在根据这个旧的位置来获取下一个位置,则会出现异常。
错误使用方法2:同上。
这里“++”运算符与我们平常的理解刚好相反,erase( itList++) 是先获取下一个元素的位置在删除; erase( ++itList) 是删除以后再获取下一个元素的位置。
在使用 vector、deque遍历删除元素时,也可以通过erase的返回值来获取下一个元素的位置:
正确使用方法 std::vector< int> Vec;
std::vector< int>::iterator itVec;
for( itVec = Vec.begin(); itVec != Vec.end(); )
{
if( WillDelete( *itVec) )
{
itVec = Vec.erase( itVec);
}
else
itList++;
}
注意:vector、deque 不能像上面的“正确使用方法2”的办法来遍历删除。
liaomingxue
2009-06-04
打赏
举报
回复
[Quote=引用 5 楼 jkdfjkdf 的回复:]
我怎么感觉这两个 new Student()无法删除呀, 为什么不用指针咧?
[/Quote]
我也有同感,但别人定义了一个这样的类型,我也没有法子
liaomingxue
2009-06-04
打赏
举报
回复
[Quote=引用 5 楼 jkdfjkdf 的回复:]
我怎么感觉这两个 new Student()无法删除呀, 为什么不用指针咧?
[/Quote]
我也有同感,但别人定义了一个这样的类型,我也没有法子
liaomingxue
2009-06-04
打赏
举报
回复
[Quote=引用 2 楼 codecola 的回复:]
先遍历,再delete, 然后erase
list <Student>::iterator it = list1.begin();
{
//找到要删除的元素
Student* p = *it;
delete p;
erase(it);
}
[/Quote]
这个不行,因为是list <Student>而不是list <Student*>
jkdfjkdf
2009-06-04
打赏
举报
回复
我怎么感觉这两个 new Student()无法删除呀, 为什么不用指针咧?
adventurelw
2009-06-04
打赏
举报
回复
要么创建有计数的智能指针或者句柄类封装
要么就是记住,什么时候不需要了遍历到那个位置删掉。
wangyadong
2009-06-04
打赏
举报
回复
个人感觉不如压入指针,最后在删除list 元素的时候delete掉
codecola
2009-06-04
打赏
举报
回复
先遍历,再delete, 然后erase
list<Student>::iterator it = list1.begin();
{
//找到要删除的元素
Student* p = *it;
delete p;
erase(it);
}
w0911h
2009-06-04
打赏
举报
回复
好像只能自己定位到那两个对象指针,然后delete
liuwg9999
2009-06-04
打赏
举报
回复
student *s=(student *)(&(*it));取的是什么呢?
wanyuzhen
2009-06-04
打赏
举报
回复
push_back()函数存放的是一份Student对象的拷贝,
原来在堆区的匿名对象 new Student()无法删除
jxwch
2009-06-04
打赏
举报
回复
为什么要加new呢?
hongzao
2009-06-04
打赏
举报
回复
[Quote=引用楼主 liaomingxue 的帖子:]
list <Student> list1;
list1.push_back((*)(new Student()));
list1.push_back((*)(new Student()));
那么如何删除中间创建的两个Student指针指向的内存空间?
[/Quote]
你在堆中申请的那两块内存在push_back()函数结束的时候就已经泄漏了.
atom210
2009-06-04
打赏
举报
回复
删不掉了。。。
如何在
list
中
删除
我指定的
对象
用for-each遍历 实际上使用的是Iterator迭代器 Iterator的工作机制: Iterator是工作在一个独立的线程
中
,并且拥有一个 mutex锁,就是说Iterator在工作的时候,是不允许被迭代的
对象
被改变的。Iterator被创建的时候,建立了一个内存索引表(单链表),这 个索引表指向原来的
对象
,当原来的
对象
数量改变的时候,这个索引表的内容没有同步改变,所以当索引指针往下移动
python
删除
list
集合
中
的某一个
对象
_
List
在执行remove方法不能
删除
指定的
对象
我们根据
List
中
的源码分析,remove方法的原理:public boolean remove(Object o){if(o ==null) {for(intindex=0;index< size;index++)if(elementData[index] ==null) {fastRemove(index);returntrue;}}else{for(intindex=0;index< siz...
Java
删除
集合
list
内的
对象
Iterator
Java
删除
集合
list
内的
对象
Iterator 工作
中
有时用到
list
,里边一般存放好多
对象
,但是昨天我遇到了一个问题,想
删除
list
中
某些不想要的
对象
,但是删掉之后
list
的长度就会改变,会导致
删除
不掉。所以这里就用到了迭代器,之前开发过程
中
还没遇到用迭代器的问题,我的粗略理解就是
list
是有下标的,根据下标来定位某一个元素,而迭代器Iterator是指向下一个元素,所以
删除
一个
list
中
的
对象
,需要使用迭代器来
删除
List
<User> user
List
= new Array
List
List
删除
对象
场景:用
List
关联关系,那么,查询出来的就是
list
集合,并且都带有下标的。我做的是
删除
操作。 想要
删除
数据,
list
中
循环遍历,进行
对象
对比,然后
删除
,这种操作我自己测试是不成的。(Object 类型的不行,String跟int类型的没有问题)。那么,怎么办? 我的处理方法是:我既然是要
删除
中
间的一个
对象
。那么,我就先直接
删除
这条数据。然后呢,我再移除
对象
为null 的这条数据。Lis
删除
List
集合
中
的
对象
问题
List
删除
符合条件的
对象
的方法
C++ 语言
65,214
社区成员
250,514
社区内容
发帖
与我相关
我的任务
C++ 语言
C++ 语言相关问题讨论,技术干货分享,前沿动态等
复制链接
扫一扫
分享
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
请不要发布与C++技术无关的贴子
请不要发布与技术无关的招聘、广告的帖子
请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下
试试用AI创作助手写篇文章吧
+ 用AI写文章