这是我的代码:
std::priority_queue<SimpleCycle,
std::vector<SimpleCycle>,
SimpleCycle> pq;
pq.push(cycle1);
pq.push(cycle2);
pq.push(cycle4);
std::cout << pq.top().to_string() << std::endl;
std::vector<SimpleCycle> pq2{ cycle1, cycle2, cycle4 };
std::make_heap(pq2.begin(), pq2.end(), SimpleCycle());
std::cout << pq2.front().to_string() << std::endl;
SimpleCycle
的比较符如下:
const bool SimpleCycle::operator()(SimpleCycle& L, SimpleCycle& R) const
{
float a = L.avg_latency();
float b = R.avg_latency();
//Allow an error rate of 0.0000000001
//Ref. The Art of Computer Programming: Seminumerical algorithms(Page 128)
return (b - a) > ((fabs(a) < fabs(b)
? fabs(b) : fabs(a)) * (0.0000000001));
}
函数avg_latency()
返回float
。但是对于相同的输入情况,我得到不同的输出。可能有什么不对?
答案 0 :(得分:2)
由于您的比较运算符&#34;允许错误率为0.0000000001&#34;,因此它不是C ++概念定义的严格弱排序(例如http://en.cppreference.com/w/cpp/concept/Compare)。
特别是,不满足严格弱排序的对称性要求。例如。如果我们调用e
错误阈值(在您的情况下,0.0000000001),我们会看到:
SimpleCycle()(1 / e, 1 / e + 1)
返回false
SimpleCycle()(1 / e + 1, 1 / e)
返回false
Igor Tandenik在评论中指出的另一个问题是,它引起的等价关系不具有传递性:a可能a足够接近b,而b足够接近c,但是a离c不够近。
根据cycle
变量中的数据,这可能会导致priority_queue
和make_heap
方法返回略有不同的最大元素
游戏中可能还存在舍入错误......