如何在不使用 lambda 表达式的情况下实现特定的比较器
How to implement a specific comparator without using the lambda expression?
我从这里得到以下代码。
class Solution {
public:
vector<pair<int, int>> kSmallestPairs(vector<int>& nums1, vector<int>& nums2, int k) {
vector<pair<int,int>> result;
if (nums1.empty() || nums2.empty() || k <= 0)
return result;
auto comp = [&nums1, &nums2](pair<int, int> a, pair<int, int> b) {
return nums1[a.first] + nums2[a.second] > nums1[b.first] + nums2[b.second];};
priority_queue<pair<int, int>, vector<pair<int, int>>, decltype(comp)> min_heap(comp);
min_heap.emplace(0, 0);
while(k-- > 0 && min_heap.size())
{
auto idx_pair = min_heap.top(); min_heap.pop();
result.emplace_back(nums1[idx_pair.first], nums2[idx_pair.second]);
if (idx_pair.first + 1 < nums1.size())
min_heap.emplace(idx_pair.first + 1, idx_pair.second);
if (idx_pair.first == 0 && idx_pair.second + 1 < nums2.size())
min_heap.emplace(idx_pair.first, idx_pair.second + 1);
}
return result;
}
};
lambda 表达式中有一行用于实现比较器:
auto comp = [&nums1, &nums2](pair<int, int> a, pair<int, int> b) {
return nums1[a.first] + nums2[a.second] > nums1[b.first] + nums2[b.second];};
pair.first
索引第一个数组nums1
而pair.second
索引第二个数组nums2
。
该比较器比较两对,其中每对包含两个数组(向量)的索引。如果第一对(array1[first_pair.first]+array2[first_pair.second])的相应数组总和大于第二对,则表达式返回 true。
我的问题是,我们可以使用结构来实现相同的比较器吗?困难的部分是如何将两个数组作为参数传递给比较器。
比较两个对(不是两个数组的索引)的结构可以通过以下方式实现:
struct myCompare {
bool operator() (const pair<int,int> lhs, const pair<int,int> rhs) const
{ return (lhs.first+lhs.second < rhs.first+rhs.second); }
};
但这是为了比较货币对条目的总和。现在我们要比较由对索引的两个数组条目的总和。
您可以在比较器的构造函数中传递数组。
struct myCompare {
// pass capture variables using constructor
myCompare(const std::vector<int>& nums1, std::vector<int>& nums2)
: nums1(nums1), nums2(nums2) {}
bool operator() (const pair<int,int> lhs, const pair<int,int> rhs) const
{ return (nums1[lhs.first] + nums2[lhs.second] < nums1[rhs.first] + nums2[rhs.second]); }
private:
const std::vector<int>& nums1;
const std::vector<int>& nums2;
};
然后像这样使用它:
myCompare comp(nums1, nums2);
priority_queue<pair<int, int>, vector<pair<int, int>>, myCompare> min_heap(comp);
将比较器与构造函数一起使用。见下文。请注意,我们通过 const 引用传递构造函数和运算符参数。
struct MyCompare
{
MyCompare(const vector<int>& arOne, const vector<int>& arTwo)
: nums1(arOne), nums2(arTwo)
{}
bool operator() (const pair<int,int>& lhs, const pair<int,int>& rhs) const
{
return nums1[lhs.first] + nums2[lhs.second]
> nums1[rhs.first] + nums2[rhs.second];
}
const vector<int>& nums1;
const vector<int>& nums2;
};
定义如下
std::priority_queue<pair<int, int>, vector<pair<int, int> >, MyCompare>
min_heap(MyCompare(arOne, arTwo));
相关文章:
- 在没有未定义行为的情况下实现类似std::vector的容器
- C++标准是否允许<double>在没有开销的情况下实现 std::可选
- 如何在编译器C++不智能的情况下实现 GLSL vec* 构造语法?
- 在不创建新节点的情况下实现带有映射的trie
- 如何在不停滞主循环的情况下实现对话系统?
- 如何在不引入未来对象切片的情况下实现 ICloneable
- 如何在没有参数的情况下实现返回双向链表大小的函数?int size() const.
- 在C++中,我不能在不分离标头和 cpp 的情况下实现此类吗?
- 如何在不修改C 中的LHS参数的情况下实现` `运算符
- 如何在不使用 lambda 表达式的情况下实现特定的比较器
- 如何在不必绑定到特定类的情况下实现观察者模式
- 是否可以在没有类型推断的情况下实现类似转发引用的行为
- 如何在不弄乱库 API 的情况下实现条件编译?
- 如何在没有这个运算符的情况下实现默认运算符<<(ostream&,T)的类型?
- 如何在无法访问 vblank 的情况下实现平均 60(或 30,或其他数字)FPS?
- 如何在不使用指针的情况下实现引用中的链表
- 如何在不使用指针的情况下实现链表
- 在没有虚拟关键字的情况下实现虚拟函数
- 如何在没有重复代码的情况下实现"const"和"non-const"重载?
- 为什么大小..(T)这么慢?在没有大小的情况下实现C++14 make_index_sequence.(T)