проблема вставки данных в SET в C ++ - PullRequest
0 голосов
/ 23 января 2020
struct XY {
    float x;
    float y;
}

struct coor {
    XY p, q, r, s;
    string type;
    int pageNo;
    friend bool operator<(coor const& m, coor const& n)
    {
        return ((m.pageNo == n.pageNo)&& (m.p.y < n.p.y)) || ((m.pageNo == n.pageNo) && ((m.p.y == n.p.y) && (m.p.x < n.p.x)))
            || ((m.pageNo != n.pageNo)&& (m.p.y < n.p.y)) || ((m.pageNo != n.pageNo) && ((m.p.y == n.p.y) && (m.p.x < n.p.x)));
    }
};

set<coor>inputs;

enter image description here


пример данных:

x1 y1 x2 y2 pageNo тип

sampleData

Я хочу вставить все эти данные в набор, показанный выше. но когда я запускаю программу, SET получает только эти данные, а не все - enter image description here

Мне нужны все данные, упорядоченные pageNo в порядке возрастания.


Может кто-нибудь сказать, пожалуйста, что я делаю не так? ТИА

1 Ответ

0 голосов
/ 23 января 2020

operator < является слишком сложным, и я не проверял, следует ли он строгому слабому порядку.

Сказав это, operator < можно переписать для проведения лексикографического сравнения с использованием кортежей: использование std::tie:

#include <tuple>
//…
friend bool operator<(coor const& m, coor const& n)
{
   return std::tie(m.pageNo, m.p.x, m.p.y) <  std::tie(n.pageNo, n.p.x, n.p.y)
}

Сначала будет выполнено сравнение pageNo, затем x, а затем y членов. Это будет гарантировать, что существует строгий слабый порядок для std::set для данных.

Обратите внимание, что должно быть достаточно компонентов для проверки, чтобы гарантировать уникальность, если вы хотите поместить все элементы в std::set. Если для сравнения требуется go глубже, чем только эти 3 элемента, просто разверните std::tie, чтобы включить тест для новых компонентов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...