为什么这样做?std :: set find with search key和custom comparator

cmo*_*cmo 6 c++ stl compare set find

我不明白为什么以下工作(虽然我很高兴它的工作原理!):

我可以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;
      }
    };
};
Run Code Online (Sandbox Code Playgroud)

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); 
Run Code Online (Sandbox Code Playgroud)

输出:"found_it-> an_int = 18"!!!!!!

我原本期望上面的代码不能编译,并且编译器会对我大喊" 18不是类型my_class".但它不......

参数不应该.findset自身的元素属于同一类型吗?这就是文档似乎说的......

Bjö*_*lex 12

这是有效的,因为int可以隐式转换为您的类.任何未标记explicit且可以使用一个不属于类本身的参数调用的构造函数都定义了隐式转换.实际上,这意味着,只要期望类类型的对象,您也可以使用a int,它将自动转换.