【发布时间】:2010-10-20 01:27:01
【问题描述】:
我正在编写一个或多或少像这样的程序:
#include <list>
list<MyClass> things;
class MyClass {
// some stuff
void remove() {
things.remove_if(THING_IS_ME);
}
};
我需要写什么来代替 THING_IS_ME?
换句话说,我使用全局 STL 列表作为事物的集合。在某些时候,列表中的对象意识到它是多余的,并希望 a) 将自己从列表中删除,并且 b) 将自己销毁。
我该怎么做?
我已经有 15 年没有编写 C++ 了,对这里的这个页面有点困惑:http://www.cplusplus.com/reference/algorithm/remove_if/
这些谓词是什么? C++ 现在有高阶函数了吗?
【问题讨论】:
-
啊。不,我完全没有意识到!!!我只是假设它会存储对我放入其中的任何内容的引用。已经 15 年了……我想我还在用 Java 思考。 :-( 谢谢
-
您确实意识到 STL 容器存储您插入的内容的副本,对吗?这意味着
MyClass的实例更好地具有可比性(例如通过operator==) - 您不能只比较地址,因为它们总是不同的。如果拥有MyClass的副本没有意义,那么使用a pointer container 可能会更好。 -
@interstar:(对不起,我在你回复之前删除了我的评论。)是的,C++ 语言默认使用复制语义。该语言要求您在代码中明确引用之类的内容。如果拥有
MyClass的副本没有意义,您可以使用a pointer container。我强烈建议您选择a good C++ book,否则您将来会被此类问题绊倒。 -
我想重点是,我真的应该明确地创建我的列表,然后只在其中存储指针。然后我可以使用 remove(this) 来比较指针值?
-
@interstar:是的,可以。请记住,如果您这样做,您必须处理任何内存管理问题。例如,您必须考虑对象生命周期以及
std::list不会自动从容器中删除的delete指针这一事实。这就是我推荐 a pointer container 的原因,它会为您解决这个问题。