【问题标题】:C++: using std::find on a set of class pointers [duplicate]C++:在一组类指针上使用 std::find [重复]
【发布时间】:2015-09-15 22:44:40
【问题描述】:

我有一组指向自定义类 myClass 的指针:

set<myClass*> s;

我正在尝试使用 std::find 来验证 myClass * 类型的对象 O 是否包含在集合中,但这似乎不起作用 - 我认为 find 可能只适用于对象而不是指向对象的指针?有什么办法可以使这项工作?我尝试取消对指针的引用,但后来我意识到这显然行不通,因为我的 set 无论如何都是指向对象的指针之一。

set<myClass*> s;
/* set gets filled up with objects of type myClass */
myClass *O = new myClass();
if(s.find(O) != s.end())
    cout<<"Found!\n";

我已经手动打印出O 的成员和集合中已经存在的一个对象,我知道它们是相同的。所以这段代码应该打印“找到!”但事实并非如此。

【问题讨论】:

  • 请发布您遇到问题的代码。谢谢!
  • 对数 std::set::find 会比线性 std::find 更有效。
  • 您确定要查找的对象O 是一个指针,如所述的myClass* 类型,而不是myClass 的实例?
  • 是的。我发布了一些示例代码来澄清。
  • 您似乎没有将指针添加到集合中...

标签: c++ pointers find std


【解决方案1】:

你有一组指针,而你没有把你的指针加到集合里,所以找不到。

以下将找到您的指针:

std::set<myClass*> s;
/* set gets filled up with objects of type myClass */
myClass *O = new myClass();
s.insert(O); // O added in set.
if (s.find(O) != s.end())
    cout<<"Found!\n"; // will be found

否则您可以使用自定义比较器。

假设你有bool operator &lt; (const myClass&amp; lhs, const myClass&amp; rhs)

你可以做

struct myClassComp {
    bool operator() (const myClass* lhs, const myClass* rhs) const
    {
        return *lhs < *rhs;
    }
};

然后

std::set<myClass*, myClassComp> s;
myClass O1;
s.insert(&O1);
myClass O2;

if (s.find(O2) != s.end())
    std::cout << "Found!\n"; // will be found

【讨论】:

  • 我将我的对象插入到集合中,我只是没有包含这些代码行,因为它们位于其他地方。第一个例子正是我正在做的,但它不起作用。我已经尝试过创建自定义比较器并覆盖 == 运算符以确保我的类比较正确,但都没有帮助。
  • 在您的 sn-p 中,您不能添加 O(指针),您可能已经在默认的 myClass 上添加了另一个指针。无论如何,你比较的是指针,而不是值。
【解决方案2】:

一组指针是由插入对象的地址组织的,而不是对象的内容。因此,在集合中查找O 就是在集合中查找地址为O 的对象。由于计算机通常不允许两个对象位于同一内存位置,因此您永远找不到O

例如,您有字符串 O 和 P。O 和 P 被初始化为相同的值,“Hello world!”但是是不同的对象,有不同的地址。

你有set&lt;string*&gt; myset;,你将P插入到集合myset.insert(&amp;P);中。到目前为止,一切都很好。

但是当您尝试在 myset 中查找 O 时,您不能,因为该集合不是在尝试查找“Hello World!”,而是在查找 &amp;O 并且 &amp;O 不是 &amp;P

所以你需要比较OP,而不是&amp;O&amp;P

在这一点上,我将您的注意力转移到这里:Using custom std::set comparator

【讨论】:

    猜你喜欢
    • 2022-01-11
    • 2012-09-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-19
    • 2012-04-08
    • 2021-11-08
    • 1970-01-01
    相关资源
    最近更新 更多