c++ - 如何在包含指向元素的指针的集合中找到元素?

标签 c++ pointers stl set containers

编辑:我修正了我的错误:我使用的是 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/

相关文章:

c - 我的这个推理哪里错了?

c++ - 如何正确地将 2D 图像纹理映射到 icosphere

c++ - qDebug - 如何以位输出数据(二进制格式)

c++ - 无法推断函数返回类型

c - C中的节点和链表语法

c++ - 从 boost::ptr_vector 获取指针而不是引用

c++ - 为什么在插入 map 时出现段错误?

c++ - C++ 中的 Fast(est) 可变堆实现

类中的 C++ std::vector,函数在返回值和大小在 foreach 中增长时崩溃

C++递归实例讲解