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:如果有人有更好的头衔,请更改它.用几句话来描述这个问题我很难.
使用自定义可比较函数更改您的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)