- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
是否可以去掉下面代码中的模板?
想法是使用 std::priority_queue
和通过自制抽象类实现 Compare
概念的类。我遇到的一些问题是:
Compare
继承的类没有默认构造函数,因为它们都有特定的参数。Algorithm
负责初始化Compare
实例使用的数据结构。算法
可能存在多个实现,使用不同的数据结构需要比较
,类的用户应该是能够决定他想使用哪个比较。我不喜欢下面给出的设计,因为实现 Algorithm
的人并不是真的被迫调用 Compare::attach
并且 Compare
类应该因此有状态管理(此处未显示)。
它还强制用户指定一个比较模板并传递相应的实例(因为编译器无法在 Algorithm
的构造函数中推断它)。 make_algo
函数可以缓解这种情况,但我宁愿避免这种奇特的构造(不是那种奇特的,但仍然如此)。
有没有一种设计可以让我在Algorithm
而不是模板中使用Compare
抽象类?
#include <vector>
#include <queue>
class Compare
{
private:
std::vector<int>* _costs;
protected:
std::vector<int>& costs() {return *_costs;}
int cost(const int i) const {return (*_costs)[i];}
public:
Compare() : _costs(nullptr) {}
void attach(std::vector<int> & costs_) {_costs = &costs_;}
virtual bool operator()( const int a, const int b ) const = 0;
};
struct CompCosts : public Compare
{
virtual bool operator()( const int a, const int b ) const
{
return this->cost(a) < this->cost(b);
}
};
struct CompEps : public Compare
{
const int eps;
CompEps(const int e) : Compare(), eps(e) {}
virtual bool operator()( const int a, const int b ) const
{
return this->cost(a)-eps < this->cost(b)+eps;
}
};
template<typename C>
struct Algorithm
{
C & comp;
Algorithm(C& comp_) : comp(comp_) {}
virtual void operator()() const = 0;
};
template<typename C>
struct Algo : public Algorithm<C>
{
Algo(C & comp_) : Algorithm<C>(comp_) {}
virtual void operator()() const
{
std::vector<int> costs;
this->comp.attach(costs);
std::priority_queue<int, std::vector<int>, C > queue(this->comp);
}
};
template<typename C>
Algo<C> make_algo(C& comp)
{
return Algo<C>(comp);
}
int main()
{
CompCosts compc;
Algo<CompCosts> algo0(compc);
auto algo1 = make_algo(compc);
CompEps compe(1);
Algo<CompEps> algo2(compe);
auto algo3 = make_algo(compe);
}
EDIT2:由于Barry提出的解决方案对每个人来说可能不是显而易见的,这里是相应的代码:
#include <iostream>
#include <vector>
#include <queue>
#include <functional>
#include <cassert>
struct Compare
{
virtual bool operator()( const int a, const int b, const std::vector<int>& costs ) const =0;
};
struct CompCosts : public Compare
{
virtual bool operator()( const int a, const int b, const std::vector<int>& costs ) const
{
return costs[a] < costs[b];
}
};
struct CompEps : public Compare
{
const int eps;
CompEps(const int e) : Compare(), eps(e) {}
virtual bool operator()( const int a, const int b, const std::vector<int>& costs ) const
{
return costs[a]-eps < costs[b]+eps;
}
};
struct Algorithm
{
std::function<bool(const int, const int, const std::vector<int>& costs )> comp;
Algorithm(
std::function<
bool(const int, const int, const std::vector<int>& costs )
> comp_
) : comp(comp_) {}
virtual void operator()() const = 0;
};
struct Algo : public Algorithm
{
Algo(std::function<bool(const int, const int, const std::vector<int>& costs )> comp_) : Algorithm(comp_) {}
virtual void operator()() const
{
std::vector<int> costs{3,2,1};
using namespace std::placeholders;
std::function<bool(const int, const int)> f = std::bind(comp, _1, _2, std::cref(costs));
std::priority_queue<int, std::vector<int>, std::function<bool(const int, const int )> > queue(f);
}
};
int main()
{
CompCosts compc;
Algo algo0(compc);
algo0();
CompEps compe(0);
Algo algo2(compe);
algo2();
}
最佳答案
自 priority_queue
持有 Compare
类型的对象, 那里的任何多态性尝试都会导致切片和失败。但是无论如何,多态性确实是对问题的过度思考(就像我在之前的修订版中所做的那样)。
只需使用类型删除。你所有的比较器都会有一个 bool operator()(int, int)
,比如:
struct CompCosts
{
std::vector<int> const& costs;
bool compare(int lhs, int rhs) const
{
return costs[lhs] < costs[rhs];
}
};
所以它们都可以由 std::function<bool(int, int)>
处理:
using Q = std::priority_queue<int, std::vector<int>, std::function<bool(int, int)>>;
然后创建您的 Q
无论你想使用哪个比较器:
Q queue_by_cost(CompCosts{costs});
Q queue_by_eps(CompEps{costs});
关于c++ - 使用自制的 `std::priority_queue` 初始化 `std::Compare` 时避免使用模板?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37465772/
我尝试使用 constructor 为 priority_queue 分配内存,但出现以下错误: No matching constructor for initialization of 'prio
#include #include #include #include struct Temp { int p; std::string str; }; struct Te
这个问题在这里已经有了答案: Boost heap Setting user defined compare function (1 个回答) 关闭 8 年前。 我正在尝试为自定义 Edge 类设置
我是 C++ 的初学者。我正在尝试使用 std::priority_queue 创建最大堆和最小堆。只创建一个 maxheap 可以正常工作,但不能同时创建两者。我似乎无法理解错误。我收到以下错误:无
如何清除使用用户定义比较的priority_queue? 来自 std::priority_queue documentation ,我将 priority_queue 的使用减少到我需要的情况(=
如何清除使用用户定义比较的priority_queue? 来自 std::priority_queue documentation ,我将 priority_queue 的使用减少到我需要的情况(=
我有一个类Node除了存储数据外,它还有一个指向其父节点的指针 Node .我将一些节点存储在 priority_queue 中并覆盖 queue; 问题是,父指针似乎搞砸了。我的猜测是,当我弹出
我想创建一个名为 Edge 的对象,它从其构造函数将自身插入到 priority_queue 中。也就是; Class Edge { int m_from; int m_to; in
代码如下: 比较算法 class PathComp{ public: virtual bool betterThan(const PathInfo& path1, const PathInfo& pa
我有 priority_queue。我的函数 delete 在内存消耗和时间方面不是很合理。我见过类似的主题,但它们对我没有帮助。 How to remove element not at top f
我有这样的代码 priority_queue, decltype(&VD::CompareByDistance)> pqDistances(&VD::CompareByDistance); 在哪里 c
我正在研究最小堆的解决方案,除了自定义比较器之外,它还需要支持删除任何元素。完全自定义的堆实现是一种方法。但我想依靠 C++ STL 来进行所需的操作。 C++ 文档和 StackOverflow 答
我有一个 Dijkstra使用 priority_queue 的类具有自定义比较功能。我将队列命名为 DijkstraPriorityQueue用using陈述。在类构造函数中,我初始化了队列。为此,
我正在为这个问题编写代码。当我遇到问题时,整数流的中位数。请注意,此问题不是算法问题,而是 priority_queue 大小的模糊行为。 #include using namespace std;
int main() { list letters; priority_queue, less>letters_trans; cout input(cin), input_e
我的文件顶部有这些: #include typedef struct cell_s { unsigned int x; unsigned int y; unsigned in
你好,我需要创建一个类,其中包含一个 priority_queue 字段,其比较函数需要访问类中的另一个字段。简而言之,我需要写这样的东西: class A { B foo; prio
当我尝试使用 priority_queue 作为类成员时,我卡住了。请查看下面的代码,让我知道为什么 L1 看不到 Type 但 L2 可以看到。我尝试了 struct,也尝试了 ctor。 如果这是
我有一个服务器应用程序,它接受传入的查询并执行它们。如果查询太多,则应将它们排队,如果执行了其他一些查询,则也应执行排队的查询。由于我想传递具有不同优先级的查询,我认为使用 priority_queu
考虑一个 std::priority_queue,其中 N 元素具有相同的优先级。现在考虑具有任意优先级的元素的一些 pop() 和 push(),因此生成的队列由所有这些 N 元素组成上面提到的加上
我是一名优秀的程序员,十分优秀!