Bạn cần phải xác định ít hơn điều hành để cho phép so sánh cho loại Node của bạn:
struct Node
{
int a;
int b;
};
bool operator<(Node const& n1, Node const& n2)
{
// TODO: Specify condition as you need
return ... ;
}
Ở đây bạn có thể kiểm tra những gì LessThan Comparable nghĩa cho một loại người dùng định nghĩa.
Giải pháp thay thế là xác định hàm functor dựa trên std::binary_function. Từ quan điểm thiết kế, tùy chọn này có lợi thế bởi vì so sánh được tách ra một cách hiệu quả từ lớp Node
. Điều này làm cho nó có thể xác định bản đồ chuyên biệt với điều kiện so sánh khác nhau (functors).
#include <map>
struct Node
{
int a;
int b;
};
struct NodeLessThan
: public std::binary_function<Node, Node, bool>
{
bool operator() (Node const& n1, Node const& n2) const
{
// TODO: your condition
return n1.a < n2.a;
}
};
int main()
{
Node node;
node.a = 2;
node.b = 3;
typedef std::map<Node, int, NodeLessThan> node_map_t;
node_map_t bb;
bb[node] = 1;
}
Vì vậy, bạn có thể định nghĩa so sánh hơn chỉ NodeLessThan
, ví dụ sử dụng các điều kiện khác nhau hoặc một chỉ so sánh bởi Node::a
khác so sánh cả hai thành phần, Node::a
và Node::b
. Sau đó, xác định các loại bản đồ khác nhau:
typedef std::map<Node, int, NodeLessThan> node_map_t;
typedef std::map<Node, int, NodeLessThanByA> node_map_a_t;
Tách lớp này ít xâm phạm hơn (không chạm vào nút Node) và có lợi để đạt được giải pháp mở rộng hơn.
cảm ơn tất cả! Tôi không nghĩ rằng bản đồ yêu cầu so sánh. – sevity
@Steve Để chính xác hơn, con trỏ CÓ THỂ không thể so sánh được với <- nó phụ thuộc vào những gì chúng trỏ tới. –
Vâng, ý tôi là, "con trỏ cùng loại không có thể so sánh được với' <'". Con trỏ đến các phần khác nhau của cùng một đối tượng/mảng có thể so sánh được, và đối với vấn đề đó tất cả các con trỏ có thể so sánh được nếu việc thực hiện nói như vậy. –