C ++:在一组类指针上使用std :: find

时间:2015-09-15 22:44:41

标签: c++ pointers find std

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

set<myClass*> s;

我尝试使用std::find来验证该集合中是否包含O类型的对象myClass *,但这似乎不起作用 - 我认为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的成员和该套装中已有的物品,我知道它们完全相同。所以这段代码应该是'#34; Found!&#34;但事实并非如此。

2 个答案:

答案 0 :(得分:2)

您有一组指针,并且您没有在集合中添加指针,因此找不到它。

以下将找到你的指针:

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 < (const myClass& lhs, const myClass& 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

答案 1 :(得分:0)

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

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

您有set<string*> myset;,并将P插入到集myset.insert(&P);中。到目前为止,一切都是时髦的。

但是当你尝试在myset中找到O时你不能因为该套装没有试图找到“Hello World!”,它正在寻找&O&O是不是&P

因此,您需要比较OP,而不是&O&P

此时,我将注意力集中在此处:Using custom std::set comparator