我有一组指向自定义类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;但事实并非如此。
答案 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
。
因此,您需要比较O
和P
,而不是&O
和&P
。
此时,我将注意力集中在此处:Using custom std::set comparator