【发布时间】:2018-12-04 08:54:40
【问题描述】:
给定以下类:
#include <vector>
using std::vector;
enum TypeSeg {
OPEN, CLOSE, CLOSE_LEFT, CLOSE_RIGHT
};
template<class T>
class Segment {
T left;
T right;
TypeSeg typeS;
public:
Segment(T left, T right, TypeSeg typeS) :
left(left), right(right), typeS(typeS) {
}
//.....
};
template<class T>
class SegCollection {
vector<Segment<T>> segments;
public:
//.....
};
所以 Segment 描述了段 ?left, right? 而:
如果 typeS==OPEN 所以:(left,right).
如果 typeS==CLOSE 所以:[left,right].
如果 typeS==CLOSE_LEFT 所以:[left,right).
如果 typeS==CLOSE_RIGHTso :(left,right]。
SegCollection 描述了段的集合,因此:
SegCollection no 包含两个相同的段,并且 no 包含两个相交的段(它将包含它们的并集),甚至 no 包含两个像这样的段:[1,4) 和 [4,5)(例如),但是,它会包含[1,5)。
我如何为 SegCollection 实现 operator-() 以从 SegCollection 中删除段,以便:此段不必在 SegCollection 中,而是 SegCollection 中存在的所有点(来自 SegCollection 中的所有段)和 将从 SegCollection 中存在的段中删除。
例如:给定:[1,7] , [9,12],如果我们将删除(2,5),那么我们将得到:[1,2] , [5,7] , [9,12]。
我不知道(我考虑了几个小时..)如果我需要在删除段后拆分段(如示例中的 [1,7] ,更改为 [1,2] , [5,7] )?
注意:Segment 是一个模板类,因为它可以来自 (int, int) , (float,float) 例如
【问题讨论】:
-
通常,您首先尝试手动完成这项工作。然后,为它编写代码。
-
@Ripi2 什么意思?
-
举一些例子,你能用纸和铅笔做吗?你能解释一下你是怎么做的吗,有哪些步骤?使用rubber duck
-
@Ripi2 对不起,我还是不明白你想要什么(也就是说,我知道你说“使用橡皮鸭”时的意思,但我做到了,就像你可以从我的问题看,但我仍然不知道该怎么做)
-
添加两个新段。起点/终点是 (3,5) 的 thouse。请注意这些新细分的“类型”-