在自定义实现的数据结构中使用谓词
Using predicates in custom implemented data structures
我为优先队列应用程序实施了一个自定义Heap
class Heap {
SomeCutsomClass elements[100];
....
....
};
现在我需要支持堆keys
之间的两种不同的比较操作,我想用c++谓词来实现它
struct less1
{
bool operator()(const SomeCutsomClass& c1, const SomeCutsomClass& c1)
{
//specific implementation
}
};
struct less2
{
bool operator()(const SomeCutsomClass& c1, const SomeCutsomClass& c1)
{
//specific implementation
}
};
理想情况下,我应该能够在 Heap
的构造函数中以某种方式传递谓词
我无法想象如何实现这一目标。
这并不是说我只想使用 predicates.Since 我不能在 SomeCutsomClass
中重载同一个运算符两次,我正在尝试使用谓词。
我尝试查找一些众所周知的数据结构的 STL 源代码,例如 std::sort
等,但它们对我来说看起来很复杂。
这是一个示例,其中包含 std::less 使用和自定义谓词作为函数 (lambda) 的示例。
#include <cassert>
#include <array>
#include <iostream>
#include <functional>
// Make heap a class template
// this allows you to specialize easily for any class
// I added the STL like third template parameter as example
// type_t is the type to store in the heap
// N is the size of the heap
template<typename type_t, std::size_t N, class Compare = std::less<type_t>>
class Heap
{
public:
using pred_t = std::function<bool(const type_t&, const type_t&)>;
Heap() :
m_predicate{ Compare() }
{
}
explicit Heap(pred_t predicate) :
m_predicate{ predicate }
{
}
bool compare(const int a, const int b)
{
return m_predicate(a, b);
}
private:
std::array<type_t, N> m_elements;
pred_t m_predicate;
};
struct SomeCustomClass
{
// all you need to make SomeCustomClass usable in Heap
// if it uses std::less as third template parameter
// is to provide this compare overload
bool operator<(const SomeCustomClass& other) const
{
return m_value < other.m_value;
}
int m_value{};
};
int main()
{
// this heap will use std::less
Heap<int, 100> less_heap;
assert(less_heap.compare(1, 2));
// create a lambda predicate
auto pred = [](const int& lhs, const int& rhs)
{
return lhs > rhs;
};
// this heap will use custom predciate
Heap<int, 100> greater_heap(pred);
assert(greater_heap.compare(2,1));
//
Heap<SomeCustomClass, 10> custom_heap;
return 0;
}
我为优先队列应用程序实施了一个自定义Heap
class Heap {
SomeCutsomClass elements[100];
....
....
};
现在我需要支持堆keys
之间的两种不同的比较操作,我想用c++谓词来实现它
struct less1
{
bool operator()(const SomeCutsomClass& c1, const SomeCutsomClass& c1)
{
//specific implementation
}
};
struct less2
{
bool operator()(const SomeCutsomClass& c1, const SomeCutsomClass& c1)
{
//specific implementation
}
};
理想情况下,我应该能够在 Heap
我无法想象如何实现这一目标。
这并不是说我只想使用 predicates.Since 我不能在 SomeCutsomClass
中重载同一个运算符两次,我正在尝试使用谓词。
我尝试查找一些众所周知的数据结构的 STL 源代码,例如 std::sort
等,但它们对我来说看起来很复杂。
这是一个示例,其中包含 std::less 使用和自定义谓词作为函数 (lambda) 的示例。
#include <cassert>
#include <array>
#include <iostream>
#include <functional>
// Make heap a class template
// this allows you to specialize easily for any class
// I added the STL like third template parameter as example
// type_t is the type to store in the heap
// N is the size of the heap
template<typename type_t, std::size_t N, class Compare = std::less<type_t>>
class Heap
{
public:
using pred_t = std::function<bool(const type_t&, const type_t&)>;
Heap() :
m_predicate{ Compare() }
{
}
explicit Heap(pred_t predicate) :
m_predicate{ predicate }
{
}
bool compare(const int a, const int b)
{
return m_predicate(a, b);
}
private:
std::array<type_t, N> m_elements;
pred_t m_predicate;
};
struct SomeCustomClass
{
// all you need to make SomeCustomClass usable in Heap
// if it uses std::less as third template parameter
// is to provide this compare overload
bool operator<(const SomeCustomClass& other) const
{
return m_value < other.m_value;
}
int m_value{};
};
int main()
{
// this heap will use std::less
Heap<int, 100> less_heap;
assert(less_heap.compare(1, 2));
// create a lambda predicate
auto pred = [](const int& lhs, const int& rhs)
{
return lhs > rhs;
};
// this heap will use custom predciate
Heap<int, 100> greater_heap(pred);
assert(greater_heap.compare(2,1));
//
Heap<SomeCustomClass, 10> custom_heap;
return 0;
}