Настраивать поведение std:: set, чтобы выдавать данные

У меня есть серия прямоугольников, хранившихся в следующем классе:

struct rectangle
{
    rectangle(int x_, int y_, int w_, int h_) :
        x{ x_ },
        y{ y_ },
        w{ w_ },
        h{ h_ }
    {}

    bool contains(int x_, int y_) const
    {
        return (x_ >= x) &&
               (x_ <= (x + w)) &&
               (y_ >= y) &&
               (y_ <= (y + h));
    }

    int x{}, y{}, w{}, h{};
};

Достаточно простой класс, который хранит координаты верхнего левого угла прямоугольника и Вашей ширины и высоты; предоставляй также функцию, которую он показывает, если определенная точка - внутри прямоугольника.

Я нуждаюсь в том, чтобы очистить мою коллекцию прямоугольников так что любой прямоугольник, который содержался бы в другом прямоугольнике, остается удаленным. Например мои данные - следующие (полная коллекция данных в конце трэда):

[00] X: 5  Y: 2  W: 3  H: 9
[01] X: 5  Y: 3  W: 3  H: 8
[02] X: 5  Y: 4  W: 4  H: 7
[03] X: 7  Y: 5  W: 7  H: 7
...
[28] X: 7  Y: 9  W: 3  H: 3
[29] X: 6  Y: 10 W: 3  H: 3

И визуальное представление первых четырех прямоугольников было бы следующей:



Прямоугольник 0 (я наполняю с вертикальными линиями) он содержит в Вашем внутреннем помещении прямоугольник 1 (я наполняю с горизонтальными линиями), но несмотря на то, что оба (0 и 1) они касаются в прямоугольники 2 (наполненный синим цветом) и 3 (наполненный желтого) они не содержат их.

Так что единственный прямоугольник между 4 первыми, что он должен был быть удаленным, был бы 1. Он подумал, что, чтобы получать функциональность, которую желал один std::set он был бы подходящим контейнером, так как этот не позволяет дубликаты..., только я должен изменять то, что значит дубликат в этом контексте, для этого создал оператор, свободный от сравнения прямоугольников:

bool operator <(const rectangle &l, const rectangle &r)
{
    return
        r.contains(l.x,       l.y) &&
        r.contains(l.x + l.w, l.y) &&
        r.contains(l.x,       l.y + l.h) &&
        r.contains(l.x + l.w, l.y + l.h);
}

std::set используй полную предкоманду посредством концепции сравнения, которое использует оператор меньший, чем (<), так что предыдущее осуществление возвратит истинный, если прямоугольник справа от операции будет содержать в Вашем внутреннем помещении все точки прямоугольника слева от операции, а именно, что прямой прямоугольник превосходящий левшу. С данными о примере прямоугольник 0 он не был бы меньшим, чем прямоугольник 1 но 1 да он был бы меньшим в 0.

Но выполнив код не только, он не удаляет мне прямоугольники, которые съедены другими прямоугольниками, если не, что удаляет мне прямоугольники, которые он не был бы должен удалять. Моей коллекции 30 прямоугольников: std::set только сохрани 0 и 1!

Я не осознаю, находится ли проблема в моем коде или в моем понимании контейнера std::set (или обе вещи). Я думаю о том, чтобы измениться одному std::vector и отлаживать контент в секунде, перемещенной вместо того, чтобы доверять механизмам контейнеров, которые не позволяют дубликаты, но он предпочел бы не делать это.

Существует какой-то способ получать поведение, которое я ищу?


[00] X: 5  Y: 2  W: 3  H: 9
[01] X: 5  Y: 3  W: 3  H: 8
[02] X: 5  Y: 4  W: 4  H: 7
[03] X: 7  Y: 5  W: 7  H: 7
[04] X: 8  Y: 5  W: 6  H: 6
[05] X: 9  Y: 5  W: 5  H: 5
[06] X: 10 Y: 5  W: 4  H: 4
[07] X: 11 Y: 5  W: 3  H: 4
[08] X: 5  Y: 6  W: 9  H: 5
[09] X: 6  Y: 6  W: 8  H: 7
[10] X: 7  Y: 6  W: 7  H: 6
[11] X: 8  Y: 6  W: 6  H: 5
[12] X: 9  Y: 6  W: 5  H: 4
[13] X: 10 Y: 6  W: 4  H: 3
[14] X: 11 Y: 6  W: 3  H: 3
[15] X: 5  Y: 7  W: 12 H: 4
[16] X: 6  Y: 7  W: 11 H: 6
[17] X: 7  Y: 7  W: 10 H: 5
[18] X: 8  Y: 7  W: 9  H: 4
[19] X: 9  Y: 7  W: 8  H: 3
[20] X: 13 Y: 7  W: 4  H: 3
[21] X: 14 Y: 7  W: 3  H: 4
[22] X: 5  Y: 8  W: 13 H: 3
[23] X: 6  Y: 8  W: 12 H: 5
[24] X: 7  Y: 8  W: 11 H: 4
[25] X: 8  Y: 8  W: 10 H: 3
[26] X: 14 Y: 8  W: 4  H: 3
[27] X: 6  Y: 9  W: 4  H: 4
[28] X: 7  Y: 9  W: 3  H: 3
[29] X: 6  Y: 10 W: 3  H: 3
6
задан 12.04.2017, 17:25
0 ответов