如何使用函数对象作为自定义比较器来访问局部变量而不是在 C++ 中使用 lambda 函数?
how to use a function object as a custom comparator for accessing a local variable instead of using a lambda function in C++?
我正在尝试学习 C++ 中的 priority_queue 概念,我遇到了这个面试问题。虽然,我设法用 lambda 函数解决了这个问题,但我无法弄清楚如何使用自定义比较器作为函数对象执行相同的操作(我认为它被称为 'functor')
我真的很难通过函数对象访问 'freq' 变量。是否可以使用函数对象来做到这一点?如果可以的话我该怎么做?
class Solution {
public:
vector<string> topKFrequent(vector<string>& words, int k) {
unordered_map<string, int> freq;
for (const auto &word : words) {
freq[word]++;
}
auto compare = [&freq](const auto &left, const auto &right)
{
if (freq[left] < freq[right]) {
return true;
} else if (freq[left] > freq[right]) {
return false;
}
return left > right;
};
priority_queue<string, vector<string>, decltype(compare)> PQ(compare);
for (const auto &iter : freq) {
PQ.push(iter.first);
}
vector<string> result;
while (k--) {
result.push_back(PQ.top());
PQ.pop();
}
return result;
}
};
您可以像这样明确地创建一个对象:
struct // no need to name the type
{
unordered_map<string, int> &freq; // store variable by reference
// write operator()
bool operator()(const string &left, const string &right) const
{
if (freq[left] < freq[right]) {
return true;
} else if (freq[left] > freq[right]) {
return false;
}
return left > right;
}
} compare{freq}; // capture freq by reference
我正在尝试学习 C++ 中的 priority_queue 概念,我遇到了这个面试问题。虽然,我设法用 lambda 函数解决了这个问题,但我无法弄清楚如何使用自定义比较器作为函数对象执行相同的操作(我认为它被称为 'functor')
我真的很难通过函数对象访问 'freq' 变量。是否可以使用函数对象来做到这一点?如果可以的话我该怎么做?
class Solution {
public:
vector<string> topKFrequent(vector<string>& words, int k) {
unordered_map<string, int> freq;
for (const auto &word : words) {
freq[word]++;
}
auto compare = [&freq](const auto &left, const auto &right)
{
if (freq[left] < freq[right]) {
return true;
} else if (freq[left] > freq[right]) {
return false;
}
return left > right;
};
priority_queue<string, vector<string>, decltype(compare)> PQ(compare);
for (const auto &iter : freq) {
PQ.push(iter.first);
}
vector<string> result;
while (k--) {
result.push_back(PQ.top());
PQ.pop();
}
return result;
}
};
您可以像这样明确地创建一个对象:
struct // no need to name the type
{
unordered_map<string, int> &freq; // store variable by reference
// write operator()
bool operator()(const string &left, const string &right) const
{
if (freq[left] < freq[right]) {
return true;
} else if (freq[left] > freq[right]) {
return false;
}
return left > right;
}
} compare{freq}; // capture freq by reference