ile bulabilirsiniz. Bu özel karşılaştırıcı, karşılaştırılan iki Nesnenin bazı üye değişkenlerini karşılaştırarak çalışır. BUT işlevini x
işlevini bir nesnenin kendisinden ziyade üye değişken türünde kullanıyorum ve işe yarıyor!Bu neden çalışıyor?</p> <p>Özel bir karşılaştırıcı ile Objelerin bir <code>std::set</code> tanımlayabiliriz: std :: set aşağıdaki eserlerini (! Ben bunun işe yaradığını memnunum rağmen) neden anlamıyorum arama anahtarı ve özel karşılaştırıcı
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: Burada
son derece basitleştirilmiş bir örnektir
...
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);
Çıktı: "found_it-> an_int = 18" !!!! !!
Yukarıdaki kodun derlenmemesini beklerdim ve derleyicinin bana "18
türünde my_class
" olduğunu söyler. Ama bu ...
.find
'un argümanları, set
'un kendisiyle aynı türde değil midir? Belgelerin söyleyeceği şey budur ...
yapıcınıza bakın: 'my_class (int new_int)'. 'int' ile başlayan bir 'my_class 'oluşturabilirsiniz. denemek ve bulmak ("blah") 've bu derleme olmaz :) – vulkanino