Tôi không hiểu tại sao các công trình sau đây (mặc dù tôi vui mừng rằng nó hoạt động!):Tại sao tính năng này hoạt động? std :: set tìm thấy với phím tìm kiếm và tùy chỉnh so sánh
tôi có thể xác định một std::set
của đối tượng với một so sánh tùy chỉnh. So sánh tùy chỉnh này hoạt động bằng cách so sánh một số biến thành viên của hai đối tượng được so sánh. NHƯNG thì tôi có thể sử dụng chức năng .find(x)
của .find(x)
với x
là loại biến thành viên chứ không phải chính đối tượng và nó hoạt động!
Dưới đây là một ví dụ cực kỳ đơn giản:
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);
Output: "found_it-> an_int = 18" !!!! !!
Tôi đã mong đợi mã trên không biên dịch và trình biên dịch sẽ hét lên với tôi rằng "18
không thuộc loại my_class
". Nhưng nó không ...
Không nên đối số với .find
có cùng loại với các thành phần của chính số set
? Đó là những gì tài liệu dường như nói ...
xem hàm tạo của bạn: 'my_class (int new_int)'. bạn có thể tạo 'my_class' bắt đầu từ' int'. thử và 'tìm (" blah ")' và nó sẽ không biên dịch :) – vulkanino