小编Dre*_*mer的帖子

操作符==的两个操作数的隐式转换

即使没有定义相等运算符,下面的代码也会编译并执行而不会出现错误:

class A {
public:
    operator bool() const { return true; }
};


int main()
{
    A a, b;
    a == b; //why does this compile?
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

内部发生a == boperator bool() const是为两个操作数调用,然后比较两个布尔值的相等性(这发生在我们的生产代码中,其中class A是一个智能指针类型,并给出了语义上可疑的结果).

我的问题是:在这种情况下,C++标准中的哪些规则允许两个操作数的隐式转换?我可以理解,如果另一个操作数已经是a 而不是两者,那么一个操作数将被隐式转换bool为相等的测试.bool

c++

11
推荐指数
1
解决办法
201
查看次数

触发Douglas-Peucker算法的Worst-Case的线?

道格拉斯-普克线简化算法具有O(N²)的最坏情况下的时间复杂度.然而,对于实际触发这种最坏情况的一条线,两件事必须立即"错误":

  • 必须将阈值设置得如此之低以至于保留大多数顶点
  • 每个递归步骤中,与当前端点之间的线偏差最大的顶点必须与其中一个端点接近(就其在线上的索引而言,而不是在其欧氏位置方面).(如果相反,与线的偏差最大的顶点的索引足够接近当前端点之间的中间,则算法应该导致深度的递归二进制细分log(n),从而导致总体时间复杂度O(n log(n)).)

虽然第一个标准很容易触发(只是将公差阈值设置为0.0),但我还没有找到满足第二个标准的线.

那么是否存在导致最坏情况行为的简单示例行(最好是触发明显最坏情况的行为,其中每个递归步骤中具有最高偏差的点直接连接到行的一个端点;但是任何其他示例还好吗?

algorithm recursion time-complexity douglas-peucker

4
推荐指数
1
解决办法
511
查看次数