如何在任何 class 中创建一个比较器函数,就像我们在 C++ STL 中的 priority_queue 中所做的那样
How to make a comparator function inside any class just like we make in a priority_queue in c++ STL
就像在 STL 中的 priority_queue 一样,我们可以像这样提供自定义比较函数:
class comp
{
bool operator()(int a, int b)
{
return a>b? 1:0;
}
};
priority_queue<int, vector<int>, comp> pq;
如何为任何 class 执行此操作?我尝试这样做是为了使用 class c
:
比较我的人 class 对象
class person
{
public:
int height;
int age;
person(int a, int h)
{
age = a;
height = h;
}
};
template<class comparator>
class c
{
public:
vector<person>p;
void compare(person p1, person p2)
{
if(comparator comp( p1, p2))
{
p.push_back(p1);
}
}
};
class compare
{
bool operator()(person p1, person p2)
{
return p1.height> p2.height ? 1:0;
}
};
然后我创建了 2 个 person
对象和一个 class c
对象“pq”,然后调用 compare
函数,就像我们在 priority_queue
中所做的那样:
person p1(23, 85);
person p2(11, 55);
c <compare> pq;
pq.compare(p1, p2);
但它给出了这个错误。
error: expected primary-expression before 'comp'
if(comparator comp(p1, p2))
^~~~
您需要创建一个要与之比较的仿函数的实例,然后调用该实例的 operator()
。
这个:
if(comparator comp( p1, p2))
不会那样做。您似乎只是试图在 if
条件下构建一个名为 comp
的 comparator
- 这是无法完成的 - 然后实际上没有努力调用 comparator
反正。将其更改为:
void compare(person p1, person p2)
{
if (comparator{}(p1, p2)) // fixed
{
p.push_back(p1);
}
}
即:先用{}
构造一个comparator
,然后用()
调用它的operator()
。
反过来,这意味着您需要其 operator()
可以通过自身访问:
class compare
{
public: // added (or omit this and change class to struct)
bool operator()(person p1, person p2)
{
return p1.height> p2.height ? 1:0;
}
};
通过这些更改,它可以正常编译。我没有检查它是否符合你的要求,但你显然需要先修复这些语法错误。
就像在 STL 中的 priority_queue 一样,我们可以像这样提供自定义比较函数:
class comp
{
bool operator()(int a, int b)
{
return a>b? 1:0;
}
};
priority_queue<int, vector<int>, comp> pq;
如何为任何 class 执行此操作?我尝试这样做是为了使用 class c
:
class person
{
public:
int height;
int age;
person(int a, int h)
{
age = a;
height = h;
}
};
template<class comparator>
class c
{
public:
vector<person>p;
void compare(person p1, person p2)
{
if(comparator comp( p1, p2))
{
p.push_back(p1);
}
}
};
class compare
{
bool operator()(person p1, person p2)
{
return p1.height> p2.height ? 1:0;
}
};
然后我创建了 2 个 person
对象和一个 class c
对象“pq”,然后调用 compare
函数,就像我们在 priority_queue
中所做的那样:
person p1(23, 85);
person p2(11, 55);
c <compare> pq;
pq.compare(p1, p2);
但它给出了这个错误。
error: expected primary-expression before 'comp'
if(comparator comp(p1, p2))
^~~~
您需要创建一个要与之比较的仿函数的实例,然后调用该实例的 operator()
。
这个:
if(comparator comp( p1, p2))
不会那样做。您似乎只是试图在 if
条件下构建一个名为 comp
的 comparator
- 这是无法完成的 - 然后实际上没有努力调用 comparator
反正。将其更改为:
void compare(person p1, person p2)
{
if (comparator{}(p1, p2)) // fixed
{
p.push_back(p1);
}
}
即:先用{}
构造一个comparator
,然后用()
调用它的operator()
。
反过来,这意味着您需要其 operator()
可以通过自身访问:
class compare
{
public: // added (or omit this and change class to struct)
bool operator()(person p1, person p2)
{
return p1.height> p2.height ? 1:0;
}
};
通过这些更改,它可以正常编译。我没有检查它是否符合你的要求,但你显然需要先修复这些语法错误。