编辑:我修正了我的错误:我使用的是 set
而不是 vector
.
请考虑以下示例代码:
set<Foo *> set_of_foos;
set_of_foos.insert(new Foo(new Bar("x")));
set_of_foos.insert(new Foo(new Bar("y")));
[...]
// The way a "foo" is found is not important for the example.
bool find_foo(Foo *foo) {
return set_of_foos.end() != set_of_foos.find(foo);
}
现在当我打电话时:
find_foo(new Foo(new Bar("x")));
函数返回false
因为找不到我要找的东西。原因对我来说很明显:指针指向不同的对象,因为它们都是用 new
分配的。 ,导致地址的不同值。
但是我想比较Foo
的内容(即上例中的 "x"
)而不是 Foo *
本身。使用 Boost 不是一个选项,也不能修改 Foo
。 .
我需要遍历每个 Foo *
吗?里面set_of_foos
还是有更简单的解决方案?我尝试唯一地序列化每个 Foo
的内容并替换 set<Foo *>
用map<string, Foo *>
,但这似乎是一个非常“黑”的解决方案,而且效率不高。
最佳答案
将您的 vector
更改为 set
并使用您自定义的比较函数来比较 Foo
对象。
应该是:
struct ltFoo
{
bool operator()(Foo* f, Foo* s) const
{
return f->value() < s->value();
}
};
set<Foo*, ltFoo> sFoo;
sFoo.insert(new Foo(new Bar("x"));
sFoo.insert(new Foo(new Bar("y"));
if (sFoo.find(new Foo(new Bar("y")) != sFoo.end())
{
//exists
}
else
{
//not exists
}
关于c++ - 如何在包含指向元素的指针的集合中找到元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4070304/