在一组指针中查找指针的内容

DrC*_*sos 4 c++ containers pointers stl set

编辑:看错了一行,这是一套当然,谢谢你发现我的(懒惰)错误.

以下示例代码:

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);
}
Run Code Online (Sandbox Code Playgroud)

现在当我这样做

find_foo(new Foo(new Bar("x")));
Run Code Online (Sandbox Code Playgroud)

它返回当然是假的,因为无法找到它.原因很明显(指针指向不同的对象,因为它们都被分配了set导致不同的地址值)给我.

我想比较vector(上例中的"x")不是false本身的.使用boost不是修改Foo的选项.

我是否需要遍历每个new内部Foo或是否有更简单的解决方案?我尝试了唯一的序列化每个内容"x"并替换为Foo *a Foo但这似乎是一个非常"黑客"的解决方案,并不是非常有效.

PS:如果有人有更好的头衔,请更改它.用几句话来描述这个问题我很难.

Svi*_*ack 6

使用自定义可比较函数更改您的vectorto 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
}
Run Code Online (Sandbox Code Playgroud)