【发布时间】:2012-02-28 15:00:46
【问题描述】:
我不明白为什么以下方法有效(尽管我很高兴它有效!):
我可以使用自定义比较器定义对象的std::set。这个自定义比较器通过比较被比较的两个对象的一些成员变量来工作。
但是然后我可以使用set 的.find(x) 函数,其中x 是成员变量类型而不是对象本身,它可以工作!
这是一个极其简化的例子:
my_class.h
class my_class //just hold an integer
{
public:
int an_int;
my_class(int new_int) : an_int(new_int)
{ }
//compare instances of this class by comparing their integers...
struct compare_instances
{
bool operator() (const my_class &a, const my_class &b) const
{
return a.an_int < b.an_int;
}
};
};
main.cpp:
...
std::set<my_class, my_class::compare_instances> my_class_set;
my_class_set.insert( my_class(18) );
my_class_set.insert( my_class(7) );
my_class_set.insert( my_class(22) );
std::set<my_class, my_class::compare_instances>::const_iterator found_it
= my_class_set.find(18);
std::fprintf(stderr, "found_it->an_int = %d\n", found_it->an_int);
输出:“found_it->an_int = 18”!!!!!!
我原以为上面的代码不能编译,编译器会冲我大喊“18 不是my_class”类型。但它没有......
.find 的参数不应该与set 本身的元素类型相同吗?这就是文档似乎所说的......
【问题讨论】:
-
看看你的构造函数:
my_class(int new_int)。您可以从int开始创建my_class。尝试find("blah"),它不会编译:)