Я не понимаю, почему работает следующее (хотя я рад, что это работает!):
Я могу определить 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
не должны быть того же типа, что и элементы самого набора
? Это то, о чем, кажется, говорится в документации ...