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

时间:2012-02-28 15:00:46

标签: c++ stl find set compare

我不明白为什么以下有效(虽然我很高兴它有效!):

我可以使用自定义比较器定义std::set个对象。此自定义比较器通过比较被比较的两个对象的某个成员变量来工作。 但是然后我可以使用set的{​​{1}}函数,其中.find(x)属于成员变量类型,而不是对象本身,它可以正常工作!

这是一个极其简化的例子:

my_class.h

x

main.cpp中:

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;
      }
    };
};

输出:“found_it-&gt; an_int = 18”!!!!!!

我原本希望上面的代码不能编译,并且编译器会对我大喊“... 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); 不是18类型”。但它没有......

my_class的参数不应与.find本身的元素类型相同吗?这就是文档似乎说的......

1 个答案:

答案 0 :(得分:12)

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