C++ 为什么这样做有效?std::使用搜索键和自定义比较器设置查找

C++ 为什么这样做有效?std::使用搜索键和自定义比较器设置查找,c++,stl,find,set,compare,C++,Stl,Find,Set,Compare,我不明白为什么下面的方法有效(尽管我很高兴它有效!) 我可以使用自定义比较器定义对象的std::set。此自定义比较器通过比较正在比较的两个对象的某些成员变量来工作。 但是然后我可以使用set的.find(x)函数,其中x是成员变量类型,而不是对象本身,它可以工作 下面是一个极其简化的示例: 我的班级 class my_class //just hold an integer { public: int an_int; my_class(int new_int)

我不明白为什么下面的方法有效(尽管我很高兴它有效!)

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

下面是一个极其简化的示例:

我的班级

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;
      }
    };
};
class my\u class//只需保存一个整数
{
公众:
int和u int;
my_类(int new_int):an_int(new_int)
{ }
//通过比较此类实例的整数来比较它们。。。
结构比较\u实例
{    
布尔运算符()
{
返回a.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); 
。。。
std::设置我的课程设置;
my_class_set.insert(my_class(18));
my_class_set.insert(my_class(7));
my_class_set.insert(my_class(22));
std::set::const\u迭代器找到了它
=my_class_set.find(18);
std::fprintf(stderr,“found\u it->an\u int=%d\n”,found\u it->an\u int);
输出:“找到它->一个整数=18”

我本以为上面的代码不会编译,编译器会对我大喊大叫“
18
不是
my_class
类型”。但它不


.find
的参数不应该与
集合
本身的元素类型相同吗?这就是文档所说的…

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

查看您的构造函数:
my\u class(int new\u int)
。您可以从
int
开始创建
myu类。试着找到(“废话”)
它不会编译:)好的,你已经把我所有的观点都添加到你的答案中了。我正在删除我的其他评论。8v)@FredLarson即使可能不相关,您是否建议始终声明显式构造函数?@vulkanino:如果您不希望隐式转换,这可能不是一个坏主意。我不知道在构造函数中添加
explicit
有什么问题,即使它不能用于隐式转换。你认为这是好的做法吗?这当然让事情变得简单了——我可以通过整数搜索对象集(多亏了隐式构造函数)。当然隐式构造函数会构建整个对象来进行搜索。。。这是浪费。有更好的方法吗?在集合中搜索我的对象?我可以使用
映射
,其中键是比较器的准成员变量。。。但这增加了复杂性。@CycoMatto:解决这个问题。